ISO 學習筆記 2015-03-15

Objective--C 

一 關鍵字
@property 定義變量函數
@synthesize  實現變量函數


二 函數
alloc 分配內存
init 初始化
new 替代上面兩個函數 分配內存,而且初始化

三 規則 

0 變量的修飾符 
@public @protected @private  @package
@public    實例變量能夠被在任何地方訪問。
@protected 實例變量能被聲明它的類和子類訪問,全部沒有顯式制定範圍的實例變量都是@protected的。
@private 實例變量只能被聲明它的類訪問。
@package 使用runtime modern,一個@package實例變量在實現這個類的可執行文件鏡像中其實是@public的,可是在外面就是@private(runtime請參考蘋果文檔Runtime Programming Guide)。
         這個類型最經常使用於框架類的實例變量,使用@private太限制,使用@protected或者@public又太開放。

1  類的實例成員變量(非靜態變量)
賦值/取值 一般能夠有三種方式,須要注意的是給字符串賦值時須要在字符串前加前綴 @ ;還有就是這些變量的訪問只能在非靜態函數轉中訪問;
A 對象.成員變量 @protected @public @private  
B 對象->成員變量  @public 
C [對象 成員變量set/get函數]  @public @protected @private  

2 類的靜態變量 
A Objective-C自身時不支持靜態變量的,可是因爲ObjectiveC是C語言的超類,因此可使用C語言的static關鍵字來建立全局變量,全局變量跟Java裏的static變量是同樣的,只有在類第一次加載的時候才初始化,知道程序被銷燬才被釋放掉
B 靜態變量的調用都必須在靜態方法中,不管是賦值仍是取值 
C static靜態變量還能夠在方法內定義,只不過在方法內定義的static靜態變量只能在方法內調用,方法外沒法調用。

3 動態函數 
A 標識符 - 
B 調用方式 [實例化對象 函數]
C 實例方法在堆棧上
D 不能調用靜態函數

4 靜態函數 
A 標識符 +
B 調用方式 [類 函數]
C 靜態方法在堆上分配內存 
D 不能調用非靜態函數,其實也不是,假如在.h中沒有定義,是不能調用的;

5 靜態方法與實例方法區分
A 靜態方法常駐內存,實例方法不是,因此靜態方法效率高但佔內存。事實上,方法都是同樣的,在加載時機和佔用內存上,靜態方法和實例方法是同樣的,在類型第一次被使用時加載。調用的速度基本上沒有差異
B 靜態方法在堆上分配內存,實例方法在堆棧上。事實上全部的方法都不可能在堆或者堆棧上分配內存,方法做爲代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的
C 實例方法須要先建立實例才能夠調用,比較麻煩,靜態方法不用,比較簡單。
D 靜態方法是靜態綁定到子類,不是被繼承。
E 通常使用頻繁的方法用靜態方法,用的少的方法用動態的。靜態的速度快,佔內存。動態的速度相對慢些,但調用完後,當即釋放類,能夠節省內存,能夠根據本身的須要選擇是用動態方法仍是靜態方法。
F 靜態方法修改的是類的狀態,而對象修改的是各個對象的狀態,這點也是它們重要的區別
G 類的實例化調用是在類的生命週期中存在,當類沒有了之後,對應的實例也就沒有了,對應的方法也就沒有了,靜態類否則,只要你引用了那個靜態類的命名空間,他就會一直存在,知道你退出系統。

6  alloc\init 與 new  
A 在實際開發中不多會用到new,通常建立對象我們看到的全是[[className alloc] init]
B 區別只在於alloc分配內存的時候使用了zone 它是給對象分配內存的時候,把關聯的對象分配到一個相鄰的內存區域內,以便於調用時消耗不多的代價,提高了程序處理速度; 
C 而爲何不推薦使用new?若是使用new的話,初始化方法被固定死只能調用init. 而你想調用initXXX怎麼辦?沒門兒
D 採用new的方式只能採用默認的init方法完成初始化,採用alloc的方式能夠用其餘定製的初始化方法。 

7 @property @synthesize 
A 做用 簡化屬性變量的SET,GET
B 簡單語法語法 
	B1 @property 數據類型 變量名; 在.h 文件中;
	B2 @synthesize 變量名;
C 複雜語法
	C1 若是事先沒有在{}中註冊成員變量 _A,可是用@property定義了成員變量_A,那麼系統會生成成員變量_A,可是該成員變量的是做用域是Private,因此了就不能用 對象->成員變量 來調用了 這個更爲簡潔
	C2 若是事先已經在{}中註冊成員變量 _A,並且用@property定義了成員變量_A,那麼系統會使用{}中成員變量_A,	並且必須在.m文件中用@synthesize實現,否則系統會報警告,	做用域以{}中的爲標準,這個更爲傳統,嚴謹
D  屬性 
	聲明property的語法爲:
	@property (參數) 類型 名字;這裏的參數主要分爲三類:
	讀寫屬性(readwrite/readonly)
	setter語意(assign/retain/copy)
	原子性atomicity(nonatomic) 	
	D1 readwrite   默認屬性 有get/set方法
	D2 readonly  只有get方法,沒有set方法 因此它不能夠和 copy/retain/assign組合使用
	D3 nonatomic  atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果
				I,    當一個變量聲明爲nonatomic時,意味着多個線程能夠同時對其進行訪問
				II,    當一個變量聲明爲nonatomic時,它是非線程安全型,訪問速度快;
				III,    當一個變量聲明爲nonatomic時,當兩個不一樣的線程對其訪問時,容易失控。
	D4 atomicity 默認屬性 線程安全原子操做
				I,當一個變量聲明爲atomic時,意味着在多線程中只能有一個線程能對它進行訪問
				II,當一個變量聲明爲atomic時,該變量爲線程安全型,可是會影響訪問速度,
				III 當一個變量聲明爲atomic時,在非ARC編譯環境下,須要設置訪問鎖來保證對該變量進行正確的get/set			
	D5 assign 簡單賦值,不更改索引計數 對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等)            I 用於基本數據類型
	D6 retain: 與strong相對應,使用了引用計數,retain+1,release -1;當引用 計數爲0時,dealloc會被調用,內存被釋放            I 一般用於非字符串對象
	D7 copy用於非共享內存時,每一個指針有本身的內存空間            I 一般用於字符串對象        
相關文章
相關標籤/搜索