Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
iPhone alloc和发布_Iphone_Objective C_Ios_Release_Alloc - Fatal编程技术网

iPhone alloc和发布

iPhone alloc和发布,iphone,objective-c,ios,release,alloc,Iphone,Objective C,Ios,Release,Alloc,我是ObjC和iPhone的新手 我下载了一个在多个视图之间共享数据的示例。基本方法是在基本UIApplication中创建数据模型对象,并从中获取/设置数据。因此,在init方法中,我看到了以下代码: - (id) init; { self.theAppDataObject = [[ExampleAppDataObject alloc] init]; [theAppDataObject release]; return [super init]; } 然后,使用委托

我是ObjC和iPhone的新手

我下载了一个在多个视图之间共享数据的示例。基本方法是在基本UIApplication中创建数据模型对象,并从中获取/设置数据。因此,在init方法中,我看到了以下代码:


- (id) init;
{
    self.theAppDataObject = [[ExampleAppDataObject alloc] init];
    [theAppDataObject release];
    return [super init];
}
然后,使用委托,我们可以访问这个对象


id theDelegate = (id) [UIApplication sharedApplication].delegate;
    ExampleAppDataObject* theDataObject;
    theDataObject = (ExampleAppDataObject*) theDelegate.theAppDataObject;

所以,我的问题在第一个代码示例中。为什么我们需要为AppDataObject对象分配内存,然后立即释放该对象?为什么我们以后访问这个对象时不得到零呢


10x

我假设
应用数据对象
被声明为
@property(retain)
。因此,当通过执行
self.theAppDataObject
(或
[self-setTheAppDataObject://code>)设置对象时,此属性将保留
示例AppDataObject
。因此,您可以在以后释放它

当您alloc并初始化ExampleAppDataObject时,它的保留计数上升到1。当您将AppDataObject设置为这个示例AppDataObject时,它会向它发送retain,因此retain计数会上升到2。然后,您可以释放自己对该对象的所有权;它不会被解除分配,因为AppDataObject仍然拥有所有权


这取决于AppDataObject属性的定义方式。 如果它提供了一个保留setter访问器,那么appDataObject的保留计数将翻转为2,比这里需要的多一个

所以释放其中一个

更好、更容易理解的方法是写作

if ( (self = [super init]) ) {
    ExampleAppDataObject *myAppDataObject = [[ExampleAppDataObject alloc] init];
    self.theAppDataObject = myAppDataObject;
    [myAppDataObject release];
}

return self;

Iphone使用基于引用计数的内存管理模型。请先参阅教程,然后参阅技术文档。。。AppDataObject是一个属性(请参阅self.theAppDataObject的用法),应该保留该属性以使上述代码正常工作。任何保留的对象都应该有一个额外的加1个保留计数…只有当其保留计数为零时,对象才会被释放。

首先要做的是:该代码示例非常糟糕

- (id) init
{
    // assign self. super may return another address
    self = [super init];
    // then check for nil
    if (self != nil) {
            // then assign the ivar directly because you should
            // not invoke methods of partially constructed objects
        theAppDataObject = [[ExampleAppDataObject alloc] init];
    }
    // then return the address super returned
    return self;
}
现在回答您的问题:

为什么我们需要为AppDataObject对象分配内存,然后立即释放该对象

self.theAppDataObject
通过setter调用,setter保留、复制或分配
theAppDataObject
。在这种情况下,我们可以假设它很可能被保留

为什么我们以后访问这个对象时不得到零呢


release
不会将指针设置为nil。它向对象发送一条消息,然后该消息将递减保留计数(在典型情况下)。在这种情况下,您可能期望的是一个已解除分配的对象。如果保留参数,则不会发生这种情况,因为在所显示的程序中,引用计数未达到零。调用setter(
self.theAppDataObject=arg
)时,对象仍处于活动状态,因为它已被保留,并且存储了对象的地址。

该示例的来源是什么?它没有遵循init方法的官方最佳实践(即第一行应该类似于
if(!(self=[super init]))返回nil;
好。你说得对。但是为什么alloc和init行将计数增加到2?alloc init行将
示例AppDataObject
的保留计数增加到1。当你使用
AppDataObject
的setter时,该对象将
retain
发送到
示例AppDataObject
并且它是retain count上升到2。因此,您可以释放对象的所有权。