Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 我何时拥有目标c中的对象?_Objective C - Fatal编程技术网

Objective c 我何时拥有目标c中的对象?

Objective c 我何时拥有目标c中的对象?,objective-c,Objective C,我不熟悉Objective-C,正在阅读有关内存管理指南的内容。我对以下两种说法感到有点困惑: 只有通过new、alloc、retain和copy创建对象,您才拥有该对象 当局部变量(指针)指向对象时,该变量拥有该对象 以下是我的困惑: “您拥有对象”和“变量拥有对象”之间的区别是什么?如果我通过new/alloc/retain/copy创建一个对象,我实际上会创建一个指向它的指针,以便指针拥有该对象。所以这两句话对我来说是一样的 为方便起见,该方法通常如下所示: - (XYZItem *)it

我不熟悉Objective-C,正在阅读有关内存管理指南的内容。我对以下两种说法感到有点困惑:

  • 只有通过
    new
    alloc
    retain
    copy
    创建对象,您才拥有该对象
  • 当局部变量(指针)指向对象时,该变量拥有该对象
  • 以下是我的困惑:

  • “您拥有对象”和“变量拥有对象”之间的区别是什么?如果我通过
    new/alloc/retain/copy
    创建一个对象,我实际上会创建一个指向它的指针,以便指针拥有该对象。所以这两句话对我来说是一样的

  • 为方便起见,该方法通常如下所示:

    - (XYZItem *)itemOnTheFly:(id)sender
    {
        XYZItem *item = [[XYZItem alloc] init]; /* Now the object has one owner, *item */
    
        return item;
    }
    
  • 我把这种方法称为:

    XYZItem *myItem = [XYZItem itemOnTheFly];
    

    据我所知,对象应该有一个所有者,即
    *myItem
    。为什么有些书说这种方式
    *myItem
    不以这种方式拥有对象?它仍然是指向对象的指针。指向对象的指针应该拥有该对象。如果*myItem处理完对象,对我来说,它仍然需要释放对象。但似乎没有必要。如果所有代码都在autoreleasepool中,则该池是该对象的唯一所有者,并将自动释放该对象<代码>*myItem不需要。怎么会是这样?如果是这种情况,那么我们不需要强/弱引用。将所有弱引用放入这种类型的无所有权引用中,并且不增加对象的所有者计数器

    在ARC之前,这是一个更重要的问题--

    当对象被保留时,您“拥有”该对象,而不会挂起抵消自动释放。因此,一个以“init”、“new”、“copy”开头的方法名,我想另一个我不记得的方法名将返回这样一个“保留对象”

    另外两个类别是“自动释放”和由其他对象“拥有”的对象

    如果这样做,例如,
    [NSArray arrayWithCount:n]
    ,则返回一个自动删除的对象。这意味着它将被保留,就像init/new/copy案例一样,但是针对它的
    autorelease
    调用将它放置在一个对象列表中,当您最终返回@autorelease块边界时,将释放它

    另一方面,如果您简单地说
    myObject=[myArray arrayAtIndex:n],该对象既不会以您的名义保留也不会自动删除。相反,它仍然由对象“myArray”拥有,这足以保证它的持续存在(只要在安全隐藏“myObject”之前不释放“myArray”)


    如前所述,在ARC之前,这一切都非常重要。使用ARC有很多方法会遇到麻烦,但这些方法相当模糊。

    只有在对对象调用autorelease时,自动释放池才适用。除此之外,当您将对象的所有权从方法中传递出去时,您应该遵守命名约定。顺便说一句,在您的示例中,myItem确实拥有该对象,但是如果您的方法也在内部存储了该对象,后来又将其自身释放,则myItem将不会拥有该对象(但如果需要,仍然可以保留和释放它,只要每次保留只释放一次)。从方法签名中无法检测到这种区别,这就是命名约定存在的原因。嗨,Dave,如果在上面的调用中,myItem不需要是创建的XYZItem对象的所有者,那么在另一种情况下,比如说,item是类的属性,itemOnTheFly是类的方法?在这种情况下,它不是简单地创建通过便利方法创建一个对象,并将其分配给指针。它通过其综合访问器为新创建的对象分配属性。在这种情况下,我相信编译器会插入一个retain以使属性成为对象的所有者。对吗?我不熟悉ARC的具体规则;我使用手动引用计数。如果如果启用了ARC,则大多数保留/释放都将变得无关紧要。如果禁用了它,编译器将不会为您提供任何帮助。