Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 对象';s所有权,在“之后”;return";。需要澄清_Objective C - Fatal编程技术网

Objective c 对象';s所有权,在“之后”;return";。需要澄清

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

假设A类的声明如下

@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 ...