接著上篇 ARC 規(guī)則中的一些變化盖高,本篇再從屬性和數(shù)組兩方面在 ARC 有效的情況下听想,記錄下其規(guī)則。 Ps:今天打球太累了贱鼻,簡單筆記下啦····
屬性
在 ARC 有效的情況下宴卖,我們可以看看屬性聲明的屬性與所有權修飾符的對應關系:
assign ==> __unsafe_unretained 修飾符
copy ==> __strong 修飾符(但是賦值是被復制的對象)
retain ==> __strong 修飾符
strong ==> __strong 修飾符
weak ==> __weak 修飾符
以上各種屬性賦值給指定的屬性中就相當于賦值給附加個屬性對象對應 所有權修飾符的變量中。只有 copy 屬性不是簡單的賦值邻悬,它賦值的是通過 NSSCopying 接口 copyWithZone: 方法賦值所生成的對象症昏。
數(shù)組
數(shù)組中使用附有__strong 修飾符變量的例子:
{
id objc[2];
objc[0] = [[NSObject alloc] init];
objc[1] = [NSMutableArray array];
}
數(shù)組超出其變量作用域時,數(shù)組中附有__strong 修飾符的變量也隨之隨之失效父丰,其強引用消失肝谭,鎖賦值的對象也隨之釋放。
但是, 附有 __strong 修飾符的變量作為動態(tài)數(shù)組使用時又如何呢分苇? 類似與 NSMutableArray, NSMutableDictioary 這些容器添诉,都會恰當?shù)某钟凶芳拥膶ο蟛槲覀児芾磉@些對象。
書中特意拿 C 語言中動態(tài)數(shù)組中使用附有 __strong 修飾符的變量医寿,進行說明栏赴。
{
id __strong * array = nil;
array = (id __strong *)calloc(entries, sizeof(id));
for (NSInteger i = 0; i < entries; ++i) {
array[i] = nil;
}
free(array);
}
其實想告訴我們的是,在動態(tài)數(shù)組中操作中附有__strong 修飾符的變量需要自己釋放所有的變量靖秩。因為在靜態(tài)數(shù)組中须眷,編譯器能夠根據(jù)變量的作用域自動插入釋放賦值對象的代碼,而在動態(tài)數(shù)組中國年沟突,編譯器不能確定數(shù)組的生存周期花颗,所以無從處理,需要將我們自己將 nil 賦值給所有的元素惠拭,使得元素所賦值對象的強引用失效扩劝,從而釋放那些對象。
拿 C 語言中的動態(tài)數(shù)組只是為了進一步說明此處的內(nèi)存管理职辅,但是我們一般都是使用NSMutableArray, NSMutableDictioary 這些容器棒呛,它們都已經(jīng)自己管理好了,此處只是為了加深理解域携。