iPhone分配和发布

时间:2011-08-05 11:43:23

标签: iphone objective-c ios release alloc

我是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;

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

10倍

4 个答案:

答案 0 :(得分:5)

我认为theAppDataObject被声明为@property (retain)。因此,在通过执行self.theAppDataObject(或[self setTheAppDataObject:])设置对象时,此属性将保留ExampleAppDataObject。因此,您可以在之后将其发布。

当您分配并初始化ExampleAppDataObject时,它的保留计数最多为1.当您将AppDataObject设置为此ExampleAppDataObject时,它会向其发送保留,因此保留计数最多为2.您可以释放自己的所有权对象;它不会被取消分配,因为AppDataObject仍然拥有所有权。

如果这是有道理的。

答案 1 :(得分:1)

这取决于如何定义AppDataObject属性。 如果它提供了一个保留setter-accessor,那么appDataObject的保留计数将翻到2,比这里需要多一个。

所以释放其中一个。

更好,更容易理解的方式是写

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

return self;

答案 2 :(得分:1)

Iphone使用基于引用计数的内存管理模型。先查看this教程,然后查看apple's技术文档... theAppDataObject是一个属性(参见self.theAppDataObject的使用),应该保留上面的代码工作..任何保留的对象应该有一个奖金加上1个保留计数...一个对象只有在其保留计数变为零时才会被释放..

答案 3 :(得分:0)

第一件事:代码示例很糟糕。

- (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;
}

现在提问:

  

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

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

  

为什么我们以后在访问这个对象时会得到nil?

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