Objective c 对象';s所有权,在“之后”;return";。需要澄清
假设A类的声明如下Objective c 对象';s所有权,在“之后”;return";。需要澄清,objective-c,Objective C,假设A类的声明如下 @property(nonatomic, assign) DoublyLinkedList *doublyLinkedList; ,作为init的一部分,初始化对象 - (id)init { self = [super init]; if (self) { doublyLinkedList = [[DoublyLinkedList alloc] init]; } return self; } 这是一种方法 - (Doubl
@property(nonatomic, assign) DoublyLinkedList *doublyLinkedList;
,作为init的一部分,初始化对象
- (id)init {
self = [super init];
if (self) {
doublyLinkedList = [[DoublyLinkedList alloc] init];
}
return self;
}
这是一种方法
- (DoublyLinkedList*) doSomethingAndReturn {
最终
return doublyLinkedList;
类A在返回后是否拥有双链接列表
?对象并不是以这种方式真正“拥有”的。当对象的保留计数达到0时,Objective-C将释放对象的内存。如果只要类A的实例处于活动状态,类A就依赖于doubleLinkedList处于“保持活动状态”,则对象A将保留doublyLinkedList以将该保留计数增加1。当对象A像上面那样返回对doublyLinkedList的引用时,收到该结果的调用方也可以选择保留该对象,这将使保留计数再次增加1
因此,尽量不要认为它拥有一个对象。相反,可以将其视为表示对某个对象的存在感兴趣。只要有人继续对该对象感兴趣(由其保留计数表示),那么该对象就不会被解除分配。对象并不是以这种方式真正“拥有”的。当对象的保留计数达到0时,Objective-C将释放对象的内存。如果只要类A的实例处于活动状态,类A就依赖于doubleLinkedList处于“保持活动状态”,则对象A将保留doublyLinkedList以将该保留计数增加1。当对象A像上面那样返回对doublyLinkedList的引用时,收到该结果的调用方也可以选择保留该对象,这将使保留计数再次增加1
因此,尽量不要认为它拥有一个对象。相反,可以将其视为表示对某个对象的存在感兴趣。只要有人继续对该对象感兴趣(通过其保留计数表示),那么该对象将不会被释放。编辑:
init
添加了alloc
您没有对其调用retain
,而是在init
中对其调用alloc
,因此它的retain计数为1——您拥有它,您应该在dealloc
中释放它
您可以简单地alloc
it并在dealloc
中释放它。属性的调用方可以选择是否保留。另一个选项是在init
中创建对象,自动释放它,然后使用(retain)
而不是(assign)
将其分配给属性。这样,如果代码中的其他位置alloc
并分配给该属性,您alloc
的对象将被释放。然后在dealloc
中,它当前分配给的内容将被释放
如果您不希望其他人设置它,另一个选项是使用(只读)
属性和\u doubleLinkedList
iVar,然后使用@synthesis doubleLinkedList=\u doubleLinkedList
。然后您可以在init
中分配它一次,并且知道没有其他人会分配它,然后在dealloc
中释放它
一个很好的类比是,当你保留的时候,你是在给它拴上皮带。多个项目可以在该对象上施加约束。只有当所有人都解开了皮带时,它才会被释放
好的阅读指南:
特别是在该文档中,这些规则有助于:
您拥有您创建的任何对象您使用方法创建对象
其名称以“alloc”、“new”、“copy”或“mutableCopy”(用于
例如,alloc、newObject或mutableCopy)
您可以使用retain获取对象的所有权
通常保证在其使用的方法内保持有效
该方法也可以安全地将对象返回到其
调用者。您可以在两种情况下使用retain:(1)在实现中
访问器方法或init方法的,以获取
要存储为属性值的对象;及(二)防止意外发生
对象作为其他操作的副作用而无效
(如“避免导致解除分配正在处理的对象”中所述)
使用“)
当您不再需要它时,您必须放弃对
您拥有的对象通过向对象发送
释放消息或自动释放消息。用可可的术语来说,
因此,通常指放弃对象的所有权
“释放”一个物体
您不得放弃您不拥有的对象的所有权
这只是先前明确规定的政策规则的推论
编辑:
init
添加了alloc
您没有对其调用retain
,而是在init
中对其调用alloc
,因此它的retain计数为1——您拥有它,您应该在dealloc
中释放它
您可以简单地alloc
it并在dealloc
中释放它。属性的调用方可以选择是否保留。另一个选项是在init
中创建对象,自动释放它,然后使用(retain)
而不是(assign)
将其分配给属性。这样,如果代码中的其他位置alloc
并分配给该属性,您alloc
的对象将被释放。然后在dealloc
中,它当前分配给的内容将被释放
如果您不希望其他人设置它,另一个选项是使用(只读)
属性和\u doubleLinkedList
iVar,然后使用@synthesis doubleLinkedList=\u doubleLinkedList
。然后您可以在init
中分配它一次,并且知道没有其他人会分配它,然后在dealloc
中释放它
一个很好的类比是,当你保留的时候,你是在给它拴上皮带。多个项目可以在该对象上施加约束。它被释放了
- (id)init {
self = [super init];
if (self) {
doublyLinkedList = [[DoublyLinkedList alloc] init];
}
return self;
}
-(void)dealloc {
[super dealloc];
[doublyLinkedList release]
}
ClassA *newClassAObject = [[ClassA alloc] init]; // create class a object
newClassAObject.doublyLinkedList = [[[DoublyLinkedList alloc] init] autorelease]; // make a DLL object, only retained by class a object.
DoublyLinkedList *dll = [newClassAObject doSomethingAndReturn]; // process the list somehow
[dll retain] // we own this now
newClassAObject.doublyLinkedList = nil; // class A object gives up interest in dll.
newClassAObject.doublyLinkedList = [[[DoublyLinkedList alloc] init] autorelease]; // now process another one.
... and on and on ...