objective-c程式設計中為了處理物件,可能將變數型別定義為id型別或者各種物件型別。
所謂的物件型別就是指向nsobject這樣的objective-c類的指標,例如:「nsbject *」。id型別用於隱藏物件型別的類名部分,相當於c語言中的void*
arc有效時,id型別和物件型別同c語言的其他型別不同,它的型別上必須附加上所有權修飾符,所有權修飾符一共有4種。
__strong修飾符
__strong修飾符是id型別和物件型別預設的所有權修飾符,也就是說,
id obj = [[nsobject alloc]init];
id __strong obj= [[nsobject alloc]init];
arc無效時:
為了釋放生成並持有的物件,增加了release方法, 等同於arc下的**。
附有__strong修飾符變數的obj在超出其變數作用域時,即會在該變數被廢棄時,會釋放其被賦予的物件。
__strong修飾符表示對物件強引用。持有強引用的變數在超出其作用域時被廢棄,隨著強引用的實效,引用的物件也會隨之釋放。
id __strong obj0= [[nsobject alloc]init];//物件a
//obj0 持有物件a的強引用
id __strong obj1= [[nsobject alloc]init];//物件b
//obj1 持有物件b的強引用
id __strong obj2 = nil;//obj2 不持有任何物件
obj0 = obj1;
//obj0持有由obj1賦值的物件b的強引用,因為obj0被賦值,所以原先持有的對物件a的強引用實效。物件a的所有者不存在,因此廢棄物件a。
此時,持有物件b的強引用的變數為 obj0,obj1。
obj2 = obj0;
//obj2持有由obj0賦值的物件b的強引用。
/此時,持有物件b的強引用的變數為obj0,obj1,obj2.
obj1 = nil;
//因為nil被賦予obj1,所以對物件b的強引用失效。
此時,持有物件b的強引用的變數為obj0和obj2。
obj0 = nil;
//因為nil被賦予obj0,所以對物件b的強引用失效。
此時,持有物件b的強引用的變數為obj2。
obj2 = nil;
//因為nil被賦予obj2,所以對物件b的強引用失效。
物件b的所有者不存在,因此廢棄物件b.
記憶體管理 四 原始碼解讀所有權修飾符 一
csdn 有道雲1.alloc new copy mutablecopy 賦值給附有 strong修飾符的變數在實際的程式中到底是這麼樣執行的呢?該原始碼實際上可以轉換為呼叫以下函式 id obj objc msgsend nsobject,selector alloc objc msgsend o...
修飾符 許可權修飾符
四種形式許可權修飾符的訪問情況 publicprotected不寫private 同乙個類中 四種都可以 同一包中的不同類 除了private剩下都可以 不同包下的子類 public protected 可以 不同包下的不同類 只有public可以 許可權修飾符 public protected 預...
C 修飾符 類修飾符和成員修飾符
c 修飾符之類修飾符 public internal partial abstract sealed static internal 本程式集內的成員可以訪問。partial 部分類,可以將乙個類分成幾部分寫在不同檔案中,最終編譯時將合併成乙個檔案,且各個部分不能分散在不同程式集中。c 修飾符之成員...