Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Cocoa touch 释放对象会破坏对象吗?_Cocoa Touch_Memory Management - Fatal编程技术网

Cocoa touch 释放对象会破坏对象吗?

Cocoa touch 释放对象会破坏对象吗?,cocoa-touch,memory-management,Cocoa Touch,Memory Management,我不熟悉cocoa touch,而且所有的语言都是非托管语言。虽然我牢牢掌握了语法,但我怀疑我是否正确地释放了一个对象 我有一个视图可以创建一个对象 Communication *comm = [[Communication alloc] init]; [comm doSomething]; [comm release]; 我知道我必须销毁这个对象,因为我正在分配它,它不会自动释放 我调用对象上的一个方法,该方法将输出到我的服务器并获取信息。当数据返回时,它抛出一个事件,我的“消息调度器”对此

我不熟悉cocoa touch,而且所有的语言都是非托管语言。虽然我牢牢掌握了语法,但我怀疑我是否正确地释放了一个对象

我有一个视图可以创建一个对象

Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];
我知道我必须销毁这个对象,因为我正在分配它,它不会自动释放

我调用对象上的一个方法,该方法将输出到我的服务器并获取信息。当数据返回时,它抛出一个事件,我的“消息调度器”对此作出响应。在对象从服务器返回之前,我不想销毁它——这就是我的困惑所在

  • 如果我在调用后直接释放该对象,它会销毁该对象吗?(我不想这么做。)
  • 在该对象抛出包含我正在等待的数据的事件后,如何正确销毁该对象?这将发生在我的
    comm
    对象上的
    datafinishedload
    事件中。它应该自我毁灭吗?这是正确的方式吗

  • 调用我的对象的视图本质上是这样的,创建这个对象,调用这个方法,然后继续你的快乐之路。它不关心调用该方法后会发生什么——不管它是否返回信息。它只是在方法上侦听以后可能遇到的任何数据。我没有理由挂起对象的引用,因为我在调用后将永远不会使用相同的实例——这是除了在我自己之后清理之外。

    在上面的示例中,
    comm
    很可能在调用
    release
    时被销毁。它取决于其他东西在
    做某事时保留它


    如果您希望在对象异步执行某项操作时保留该对象,请将其放在保留属性中。当它通知您该操作已完成时,将属性设置为
    nil
    ,这将释放该对象。

    A
    release
    仅在最后一个固定器释放该对象时才销毁该对象

    例如,假设您分配了
    通信
    对象。它隐式保留一次。然后你保留它五次。您需要释放/自动释放对象六次,直到它被销毁(调用其
    dealloc
    方法)


    有一个内部计数器,
    retainCount
    。创建对象时,将其设置为
    1
    。现在,每次
    retain
    增加计数器,每次
    release
    减少计数器<代码>自动释放也会减少计数器,但不会立即减少。一旦计数器降至0,Objective-C就知道不再需要该对象并将其销毁(通过调用该对象的
    dealloc
    警告:不要依赖于
    重新计数
    ,甚至不要查看它。您应该只关心您的
    alloc/copy/new/retain
    调用稍后是否与相应的
    release/autorelease
    平衡。

    是否可以将我的通信对象设置为在完成后自动释放自己?@George:您可以执行
    comm=[[Communication alloc]init]autorelease],一旦您离开了进行此操作的方法,对象将被释放一次(但您不知道何时释放,也不需要在意)。你可能是说,我希望物体一旦完成工作就消失。这是更棘手的。最好的方法是以某种方式发出工作已完成的信号(例如,通过委托方法),并让对象的创建者释放它。但是一个对象不应该做
    [自我释放]或者什么的,如果你是这个意思的话。虽然可能,但它的风格不好且令人困惑。在我从视图中调用该对象并在稍后返回数据后,通信对象将向我的应用程序代理发出信号,表示通过订阅来自我的服务器。此时,通信对象已经完成了所有的工作,不再需要它了——至少不再需要它的实例。在那里发布是否合适?或者这就是你建议反对的[自我释放]。@George:你会这样做:控制器分配它,使用
    [[Communication alloc]init]
    并将其存储在实例变量中。您不能在此处调用
    release
    。我假设这个控制器是委托。对象完成工作,然后调用委托/控制器。控制器现在对通信对象调用
    release
    (并将变量设置为
    nil
    )。