objectivec加密
① objective-c上的加密數據與RSA公鑰不給予預期結果怎麼解決
1、用公鑰加密,用私鑰解密。2、給別人發信息,就從伺服器上拉下來別人的公鑰,加密後發給他。3、對方拿到信息後用自己的私鑰解密。4、這樣,公鑰加密後除了私鑰持有人,別人都看不到信息。5、若是用私鑰加密,那麼公鑰都能解密,還有何安全性可言?6、私鑰加密的場合只有一個,那就是數字簽名,用來表明這個信息來源於你。
jd-gui這個工具可以進行反編譯的操作。 不過反編譯的質量隨著混淆的程度而定。
特別復雜的代碼(如加密演算法)反編譯一般都有問題。可以建議用 javap -c -p 來看位元組碼。然後參考jvm指令。
一般編譯的文件,都可以反編譯為源碼,但如果是經過加密、以及代碼異常復雜,是很難恢復全部的源碼。
③ objective-c怎樣創建txt文檔使用什麼類和方法通過一個目錄創建文檔
創建不能被別人打開和刪除的文件
這種方法很好用,比如你往裡放了,病毒或其他文件,防火牆查到了也殺不了.
在開始菜單里「運行」欄中執行「cmd」命令,打開命令提示符窗口,在其中輸入「D:」命令(不含引號,下同),接著在「D:」後輸入「 md 1 s..」,按回車鍵。現在你在去D盤里去看看,有沒有1文件呵呵,你現在可以刪除或移動他試試..如果有興趣繼續往下看↓
硬碟炸彈。其實這也是利用普通人不知道如何刪除這些文件夾的原理,編一個程序(病毒或者批處理都行),建立一個或者多個這樣的文件夾,然後往裡面復制東西,越大越好,於是乎,宿主計算機中的硬碟越來越小,越來越小……直至沒有。
另外,這個文件夾還有一個特點,那就是無論你放多少文件進去,它始終顯示文件大小為零,而實際上它卻又真正佔用硬碟空間,故隱藏起來很方便。
知道了原理,那麼就在Windows XP下簡單的創建「S」文件夾吧。咦?怎麼系統會提示「文件名不能包含『』符號」。看來微軟早已想到這一點了,看來只好採取其它辦法來創建這個「特殊」文件夾了。
在「運行」欄中執行「cmd」命令,打開命令提示符窗口,在其中輸入「c:」命令(不含引號,下同),接著在「c:」後輸入「mkdir s..」,按回車鍵。現在,打開資源管理器,可看到C盤下建立了一個名為「s.」的文件夾,不過這個文件夾既不能打開也不能刪除。不能打開是因它的實際路徑是「c:s..」(由於是我們自己創建的,所以可以確定它的實際路徑),但在系統資源管理器中,它的文件夾名變成了「s.」,這樣當試圖打開它時,系統實際上嘗試打開的是「c:s.」,這當然是不能打開的。由於系統認為該文件夾並不存在,所以會報錯,不能刪除也是基於此原因。
如果在c:後鍵入mkdir s...按回車鍵,在資源管理器中會看到名為「s..」的文件夾,而這個文件夾可以打開但無法刪除。但實際上這個文件夾是無效的,在Windows XP下拷貝任意一個文件到這個文件夾,再打開時便會發現其中什麼也沒有。
雖然新建的「s..」文件夾不能打開也不能刪除,但它卻不妨礙我們向其中拷貝文件。不過需要注意的是,一旦對這個文件夾進行了操作,便會在當前路徑下多出一個名為「s」的文件夾,此時這兩個文件夾便都可以正常打開了,但裡面的內容均為空。這時只要刪除其中任意一個文件夾,留下的文件夾便又無法在資源管理器中,進行正常的打開或刪除操作了。
既然這樣的文件夾在Windows下不會被刪除,那麼就大可放心的將黑客工具或重要文件保存其中了。經過測試,在其中即使存放木馬甚至病毒程序,也不會被殺毒軟體查殺到了。
雖然這類文件夾在資源管理器中不能正常打開,但可以通過「運行」欄進行開啟,前提是知道該文件夾的真實路徑。比如本例便可在「運行」欄中鍵入「c:s..」後,按回車鍵來打開這個文件夾。
最後再來說說這類文件夾的刪除方法。如果文件夾是空的,可在命令提示符窗口中輸入「c:」,然後再鍵入「RMDIR s..」命令,按回車執行後即可刪除。如果文件夾中已存放了文件,則可鍵入「RMDIR s../s」命令,按回車鍵後,提示「s.., 是否確認(Y/N)?」時,鍵入「y」鍵刪除該文件夾
看到這里,很多朋友可能發現建立這樣一個文件夾,不僅可起到防止誤刪除的目的。還可將一些重要資料存放其中,達到另類加密的效果,一般的菜鳥還真是解不開這個秘密
④ Objective-C
分類就是對裝飾模式的一種具體實現。它的主要作用是在不改變原有類的前提下,動態地給這個類添加一些方法。
在分類中添加了一個屬性時,只是聲明了對應的set方法和get方法,並沒有為我們在分類當中添加了實例變數。
如果要為分類添加實例變數,是通過關聯對象來添加的。
分類結構體:
category_t實際上就是我們創建的分類文件
這里沒有實例變數的結構
從類別的結構體我們可以看到,分類可以添加屬性,不能添加成員變數
當我們程序啟動之後,在運行時會調用_objc_init方法,實際上是在runtime的初始化方法,然後會調用一系列方法,最後載入分類。
例如,調用_objc_init初始化方法後,會調用map_2_images方法,然後調用map_images_nolock方法,然後再調用_read_images,最後調用remethodizeClass:,分類的載入的邏輯都在remethodizeClass:方法的內部開始。
調用runtime的_objc_init方法,進行初始化操作,注冊鏡像狀態改變時的回調函數,調用內存鏡像相關處理的map_2_images函數,map_2_images主要是加鎖並調用map_images_nolock,map_images_nolock完成所有 class 的注冊、fixup等工作,還有初始化自動釋放池、初始化 side table 等工作並在函數後端調用讀取鏡像函數_read_images,讀取鏡像函數_read_images載入可執行文件,比如載入類、Protocol、Category,最後調用remethodizeClass函數,分類的內部實現都在remethodizeClass函數裡面。,
協議中可以定義:屬性,方法
問題:我們在協議中聲明的方法或者屬性,代理方都必須實現嗎?
不一定,在協議中被聲明為require,是必須實現的,如果是optional的,可以不實現。
問題:代理方和委託方之間是是以什麼樣的關系存在的?
代理方用strong關鍵字來強持有委託方,委託方用weak關鍵字來聲明代理方,弱引用代理方,這樣的目的是以規避循環引用。
數據層,網路層,業務邏輯層,UI層
通知是怎樣實現一對多的傳遞方式的
通知一對多的流程:
在通知中心(NSNotificationCenter)這個系統類當中,可能內部會維護一個Notification_Map表,或者說字典,這個字典當中的key是notificationName,即監聽的通知名稱,值就是就是我們添加的Observers_List,對於同一個名稱的通知,添加多個Observer,所以Observer對應的值,應該是一個數組列表,這個列表中的每個成員,都包含通知接收的觀察者和這個觀察者調用的方法,比如說,我們收到這個通知之後,觀察者的回調方法是哪個,那麼在這個列表當中的每個元素裡面也會體現關於這個通知回調方法的一些相關數據信息。
KVO是Key-value observing的縮寫。
KVO是Objective-C對觀察者設計模式的又一實現。
Apple使用了isa 混寫(isa-swizzling)來實現KVO。
當我們調用了addObserver:forKeyPath:options:之後,系統在運行時動態創建NSKVONotifying_A這么一個子類,同時將原來的類A的isa指針指向新創建的類,重寫set方法,來實現kvo的機制的。
NSKVONotifying_A是原來的類A的一個子類,之所以做這個繼承關系,是為了重寫A類的setter方法,然後這個子類對setter方法的重寫來達到可以通知觀察者的目的。
didChangeValueForKeyceiling這個方法就會觸發 observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context 回調方法來通知我們的觀察者value發生了變化
KVC:是Key-value coding的縮寫,鍵值編碼技術,和鍵值編碼技術相關的兩個方法:
當調用value:forKey的時候,首先系統會判斷我們通過這個key所訪問的對應的實例變數是否有相應的getter方法,如果有,直接調用,然後結束value:forKey的調用流程;
如果對應的getter方法不存在,就會通過系統的+ (BOOL)判斷實例變數是否存在,如果和我們這個key相同或者相似的成員變數存在的話,那麼直接獲取這個實例變數的值,然後結束value:forKey流程;
如果這個實例變數不存在,就會調用當前實例的valueForUndefinedKey:方法,然後會拋出NSUndefinedKeyException未定義key的異常,然後結束value:forKey調用流程。
我們在用value for key 獲取一個key同名或者相似名稱的成員變數的時候,訪問器定義方法的定義,實際上也涉及到一個相似的概念,比如說,如果我們實現了get方法,叫getKey,同時滿足駝峰命名方法,那麼value for key的調用流程,也會認為這個key所對應的成員變數是存在訪問器方法的。最常見的屬性名稱,也就是我們get方法的名稱。除了<getKey>和<key>,還有<isKey>,如果說,我們傳遞參數的key,那麼和它對應的成員變數,如果實現了一個叫isKey的get方法,那麼在value for key調用流程當中也會認為它的訪問器方法是存在的。
問題:實例變數是否存在的判斷規則
只要存在_key、_isKey、key、isKey,就可以獲取到對應的值。
調用setValue:forKey的時候,首先會判斷是否有和這個key相關的Setter方法的存在,如果有,直接調用,然後結束setValue:forKey流程;
如果沒有,就會通過系統的+ (BOOL)判斷實例變數是否存在,如果這個實例變數存在的話,那麼對這個key所對應的成員變數進行賦值,然後結束setValue:forKey流程;
如果這個實例變數不存在,就會調用當前實例的setValue:forUndefinedKey:方法,然後會拋出NSUndefinedKeyException未定義key的異常,然後結束setValue:forKey流程。
1)讀寫許可權:readonly,readwrite(默認)
2)原子性:
atomic(默認):賦值和獲取,是線性安全的,但對於操作是不能保證線性安全的。
nonatomic
3)引用計數器
retain(MRC):修飾對象
strong(ARC):修飾對象
assign(修飾基本數據類型和對象類型)
unsafe_unretained(MRC中使用比較頻繁)
weak
修飾基本數據類型,如int、BOOL等。
修飾對象類型時,不改變其引用計數。
會產生懸垂指針。
懸垂指針會造成內存泄露
assign所修飾的對象,在被釋放之後,assign指針仍然指向原對象內存地址,這個時候,如果通過assign指針繼續訪問原對象的話,可能就會由於懸垂指針的原因造成內存泄露或者程序異常。
空指針:指針指向的地址為空的指針叫空指針(NULL指針)
野指針:是指向「垃圾」內存(不可用內存)的指針
產生原因:指針創建時未初始化。指針變數剛被創建時不會自動成為NULL指針,它會隨機指向一個內存地址。
懸垂指針:指針所指向的對象已經被釋放或者回收了,但是指向該對象的指針沒有作任何的修改,仍舊指向已經回收的內存地址。 此類指針稱為垂懸指針。
weak和assign都不改變對象的引用計數
淺拷貝的特點:
1、引用計數器增加。
2、不會開辟新的內存空間,不會發生新的內存分配。
深拷貝的特點:
1、不會增加被拷貝對象的引用計數
2、深拷貝產生新的內存分配
關鍵字
Block是將函數及其執行上下文封裝起來的對象。
block本質上也是一個oc對象
Block調用即是函數的調用。
原因:__block修飾的變數變成了對象
棧上的__block的__forwarding指針是指向__block自身的。
impl.isa = &_NSConcreteStackBlock;(isa:標識當前block的類型)
1、_NSConcreteGlobalBlock
2、_NSConcreteStackBlock
3、_NSConcreteMallocBlock
不同類型的block在內存上面的分布:
1、全局類型的block:已初始化數據區
2、棧上面的block:棧區
3、堆上面的block:堆區
Block的操作
__block變數中是有一個__forwarding指針,棧上的__forwarding是指向block自身的,前提是棧上的。
我們在棧上創建了一個變數multiplier,如果通過__block修飾符修飾之後,multiplier就變成了一個對象,所以說multiplier=6 的賦值,實際上不是對變數賦值,而是通過multiplier這個對象的__forwarding指針,然後對其成員變數multiplier進行賦值,_blk實際上是某一個對象的成員變數,當對_blk進行賦值操作的時候,實際上就會對_blk進行操作,那麼_blk就會被拷貝到堆上面去,然後我們對block進行執行,multiplier=6 代表的含義就是通過棧上的multiplier的__forwarding指針找到堆上面所對應的__block變數的副本,然後對其副本進行值的修改,右邊block執行邏輯,我們調用了堆上面的block,入參為4,在我們調用的時候,這個時候我們在block的執行體當中所使用的multiplier __block變數,實際上使用的是堆上面的__block變數,那麼我們在這里,實際上經過之後,multiplier=6 ,它是對堆上面的block變數的修改,所以我們在右邊調用之後的結果是4和6的乘積為24。
當前對象用屬性關鍵字聲明了_strBlk,所以當前對象對_strBlk有一個強引用的,而_strBlk的表達式當中又使用到了_array成員變數,block截獲變數的時候,對於對象類型的局部變數或者成員變數,實際上會連同屬性關鍵字一起截獲的,而array一般用strong屬性關鍵字修飾的,所以在這個block中就有一個strong類型的指針指向當前對象,由此就產生了一個自循環引用。
會造成自循環引用,屬於自循環。
解決方案:我們可以通過在當前棧上面創建一個__weak修飾符修飾的一個weakArray變數,來指向原對象的array成員變數,然後在block當中使用我們創建的weakArray,由此,我們就可以解除這個自循環引用。
在棧上面,我們通過__block修飾符修飾的變數來指向當前對象,同時當前對象的成員變數_blk在這里進行創建,block的表達式當中有使用到blockSelf的var變數。
在MRC下,不會產生循環引用,在ARC下,會產生循環引用,引起內存泄漏
ARC下的引用循環
ARC下的解決方案
MRC下同樣沒問題
這種解決方案有一個弊端:就是說如果我們很長一段時間或者說永遠都不會調用_blk的話,那麼這個引用循環的環就會一直存在。
⑤ 編程都有哪些語言
幾種常用編程語言簡單介紹
1.c語言
是一種計算機程序設計語言。它既具有高級語言的特點,又具有匯編語言的特點。它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。它的應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到c語言,始於編寫程序軟體,三維,二維圖形和動畫。具體應用比如單片機以及嵌入式系統開發。
優點:簡潔緊湊,靈活方便,運算符豐富,數據類型豐富,c是結構式語言,語法限制不太嚴格,程序設計自由度大,生成目標代碼質量高,程序執行效率高。
缺點:沒有面向對象編程功能(OOPs),運行時類型檢查是不可用,C不能夠在一個范圍內再次使用相同的變數名,構造函數和析構函數不可用,必須通過方法或者以其他方式來手動實現變數的析構和構造。
2.c++
是在c語言的基礎上開發的一種面向對象編程語言,應用廣泛。它的主要特點表現在兩個方面:一是盡量兼容c,二是支持面向對象的方法。它操持了c簡潔,高效的接近匯編語言等特點,對c的類型系統進行了改革的擴充。
應用領域:游戲,科學計算,網路軟體,分布式應用,操作系統,設備驅動程序,移動設備,嵌入式系統,教育與科研,部分行業應用,其他應用。
3.c#
是微軟對這一問題的解決方案。C#是一種最新的、面向對象的編程語言。
主要特點:簡單,現代,面向對象的,類型安全,相互兼容性,可伸縮性和可升級性。
主要領域:web應用,客戶端應用,分布式計算,人工智慧,各類游戲。
4.visual 語言
一種直譯式程序設計語言。名稱字面為意思「初學者的全方位符式指令代碼」,設計給初學者使用的編程語言,在完成編寫後不須經由編譯及鏈接等手續,經過解釋器即可運行,但如果需要單獨運行時仍然需要將其創建成可執行文件。
特點:(1)面向對象和可視化的程序設計。
(2)事件驅動的運行機制。
(3)結構化的程序設計語言。
(4)多種資料庫訪問能力。
(5)提供了功能完備的應用程序集成開發環境。
(6)方便使用的聯機幫助功能。
5.perl 語言
是一種解釋型的腳本語言。Perl語言由Larry wall干1986年開發成功。當初的目的主要是在Unix環境下,用於處理面向系統任務而設計的腳本編程語言。Perl對文件和字元有很強的處理、變換能力,它特別適用於有關系統管理、資料庫和網路互聯以及WWW程序設計等任務,這樣使得Perl稱為系統維護管理者和CGI編制者的首選工具語言。
特點:
1. Perl的解釋程序是開放源碼的免費軟體,使用Perl不必擔心費用。
2. Perl能在絕大多數操作系統運行,可以方便地向不同操作系統遷移。
3. Perl 是一種能完成任務的語言。從一開始,Perl 就設計成可以把簡單工作簡單化,同時又不失去處理困難問題能力的語言。它可以很容易操作數字,文本,文件和目錄,計算機和網路,特別是程序的語言。這種語言應該很容易運行外部的程序並且掃描這些程序的輸出獲取感興趣的東西。而且它還應該很容易能把這些你感興趣的東西交給其它程序做特殊的處理。當然,這種語言還應該很容易在任何現代的操作系統上可以移植地編譯和運行。
6.java
是一門面向對象編程語言,不僅吸收了c++語言的各種優點,還摒棄了c++里難以理解的多繼承,指針等概念,因此java語言具有功能強大和簡單易用兩個特徵。java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
特點:簡單性,面向對象,分布性,編譯和解釋性,穩健性,安全性,可移植性,高能性,多線索性,動態性。
應用:android應用,在金融業應用的伺服器程序,網站,嵌入式領域,大數據技術,高頻交易的空間,科學領域。
7.Objective-C
通常寫作ObjC或OC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。
特點:1、動態運行環境,適合UI編程
在Objective-C中,如下語法並非單純的函數調用,而是向某對象發送消息。
2、方便與C/C++混合使用
Objective-C中的C擴展部分,使用符號@開頭。比如@class、@interface、@"Hello,World"。而它的消息發送語法則是使用中括弧而不是圓括弧。
3、運行速度相對較快
Objective-C編譯後是機器原生指令,運行時環境也小而緊湊。它採用引用計數的內存管理方式,並引入ARC。ARC比GC更容易引起編程錯誤,但卻比GC快。而在性能很重要的場合,Objective-C也很容易直接調用C/C++代碼。相對於其他使用虛擬機、採用GC以及間接調用C/C++的移動平台,速度優勢非常明顯。
應用:ios操作系統,ios應用程序,mac os x操作系統,mac osx上的應用程序。
8.PHP
是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
特點:
1. PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。
2. PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,
PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現。
3. PHP支持幾乎所有流行的資料庫以及操作系統。
4. 最重要的是PHP可以用C、C++進行程序的擴展!
9.python
是一種面向對象的解釋型計算機程序設計語言,由荷蘭人Guido van Rossum於1989年發明,第一個公開發行版發行於1991年。
Python是純粹的自由軟體, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協議 。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。
特點:簡單,易學,速度快,免費、開發,高層語言,可移植性,解釋性,面向對象,可擴展性。
應用:
系統編程,圖形處理,數學處理,文本處理,資料庫編程,網路編程,多媒體應用,pymo引擎,黑客編程。
10.ruby
是一種簡單快捷的面向對象(面向對象程序設計)腳本語言,在20世紀90年代由日本人松本行弘(Yukihiro Matsumoto)開發,遵守GPL協議和Ruby License。它的靈感與特性來自於Perl、Smalltalk、Eiffel、Ada以及Lisp 語言。
優點
語法簡單,普通的面向對象功能(類,方法調用等),特殊的面向對象功能(Mixin,特殊方法等,操作符重載,錯誤處理功能迭代器和閉包,垃圾回收,動態載入,可移植性高。