接着上篇 ARC 规则中的一些变化,本篇再从属性和数组两方面在 ARC 有效的情况下,记录下其规则。 Ps:今天打球太累了,简单笔记下啦····
属性
在 ARC 有效的情况下,我们可以看看属性声明的属性与所有权修饰符的对应关系:
assign ==> __unsafe_unretained 修饰符
copy ==> __strong 修饰符(但是赋值是被复制的对象)
retain ==> __strong 修饰符
strong ==> __strong 修饰符
weak ==> __weak 修饰符
以上各种属性赋值给指定的属性中就相当于赋值给附加个属性对象对应 所有权修饰符的变量中。只有 copy 属性不是简单的赋值,它赋值的是通过 NSSCopying 接口 copyWithZone: 方法赋值所生成的对象。
数组
数组中使用附有__strong 修饰符变量的例子:
{
id objc[2];
objc[0] = [[NSObject alloc] init];
objc[1] = [NSMutableArray array];
}
数组超出其变量作用域时,数组中附有__strong 修饰符的变量也随之随之失效,其强引用消失,锁赋值的对象也随之释放。
但是, 附有 __strong 修饰符的变量作为动态数组使用时又如何呢? 类似与 NSMutableArray, NSMutableDictioary 这些容器,都会恰当的持有追加的对象并为我们管理这些对象。
书中特意拿 C 语言中动态数组中使用附有 __strong 修饰符的变量,进行说明。
{
id __strong * array = nil;
array = (id __strong *)calloc(entries, sizeof(id));
for (NSInteger i = 0; i < entries; ++i) {
array[i] = nil;
}
free(array);
}
其实想告诉我们的是,在动态数组中操作中附有__strong 修饰符的变量需要自己释放所有的变量。因为在静态数组中,编译器能够根据变量的作用域自动插入释放赋值对象的代码,而在动态数组中国年,编译器不能确定数组的生存周期,所以无从处理,需要将我们自己将 nil 赋值给所有的元素,使得元素所赋值对象的强引用失效,从而释放那些对象。
拿 C 语言中的动态数组只是为了进一步说明此处的内存管理,但是我们一般都是使用NSMutableArray, NSMutableDictioary 这些容器,它们都已经自己管理好了,此处只是为了加深理解。