Ios 文本语法的内存管理
创建数组变量有三种模式:Ios 文本语法的内存管理,ios,objective-c,arrays,memory-management,Ios,Objective C,Arrays,Memory Management,创建数组变量有三种模式: NSArray*数组=@[@0,@1] NSArray*array=[NSArray arrayWithObjects:@0、@1、nil] NSArray*array=[[NSArray alloc]initWithObjects:@0、@1、nil] 当我使用第二种模式创建时,varialbe“array”将被抛出到autoreleasepool; 当我使用第三个时,var的retainCount将是1,但不会被抛出到autoreleasepool; 我想知道
NSArray*数组=@[@0,@1]代码>
NSArray*array=[NSArray arrayWithObjects:@0、@1、nil]代码>
NSArray*array=[[NSArray alloc]initWithObjects:@0、@1、nil]代码>
第一和第二模式的结果相同。 第一种模式是第二种模式的一种方便语法
来源:一般规则是,如果您没有调用以“alloc”或“new”开头或包含“copy”的方法,那么您就不拥有该对象,也没有权利也没有责任释放它。当然,如果你明确地保留了一个对象,那么你必须用释放(或者自动释放,这只是安排释放它的另一种方式)来平衡它
不要试图对自动释放池中可能存在或不存在的对象进行推理。此外,不要试图对保留计数进行推理。关注自己的所有权和责任。
总是把保留数看作是增量。因此:
1. NSArray *array = @[@0, @1];
array
的retain count为+0(它在创建时已保留并随后自动删除在很大程度上是无关的,事实上,它可能根本没有被保留并自动删除--NSString*foo=@“foo”;
具有完全相同的+0语义,但实现细节不是retain/autorelease)
与(1)相同,只是需要更多的手指锻炼
NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];
就您而言,
数组
有一个+1保留计数。您需要知道的唯一细节是,要放弃代码对array
的责任,该对象必须是release
d或autorelease
d。它是否是使用+1保留计数创建的。。。是否有42的内部保留计数。。。是否保留5次并自动删除4次。。。。所有这些都与您的代码完全无关。除了内存分配的细节之外,它们之间有一个很大的区别
NSArray* array = @[obj1, obj2, obj3];
及
第二个将在第一个零参数处停止。您需要一个包含三个元素的数组,但如果obj1!=nil和obj2==nil则结果是一个包含一个元素的数组。如果obj1、obj2或obj3中的任何一个为nil,则第一个将引发异常 不完全正确:文本扩展为
+[NSArray arraywhithobjects:count:://code>。但是关于自动释放,结果是一样的,正如你所说的。同样重要的是要注意,使用ARC,许多自动释放的例子都被优化了,所以关于自动释放池的推理更加困难和徒劳。虽然这个答案有很好的信息,但实际上并没有回答这个问题。“1是像2还是3?@rmaddy,我认为它回答得很好#1不涉及调用以“alloc”或“new”开头或包含“copy”的方法#2也不涉及这一点#3岁。所以,我不能指望读者从中得出结论(www.whentouseretaincount.com.:)
NSArray* array = @[obj1, obj2, obj3];
NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];