0

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

4 回答 4

5

我假设theAppDataObject被声明为@property (retain). 因此,当通过do self.theAppDataObject(或[self setTheAppDataObject:])设置对象时,该属性将保留ExampleAppDataObject。因此,您可以在之后释放它。

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

如果这是有道理的。

于 2011-08-05T11:49:05.463 回答
1

这取决于 AppDataObject 属性的定义方式。如果它提供了一个保留 setter-accessor,则 appDataObject 的保留计数将翻转为 2,比此处需要的多一个。

所以释放其中一个。

更好和更容易理解的方法是写

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

return self;
于 2011-08-05T11:52:21.577 回答
1

Iphone 使用基于引用计数的内存管理模型..请先查看教程,然后再查看苹果的技术文档...AppDataObject 是一个属性(请参阅 self.theAppDataObject 的使用),应保留该属性以使上述代码正常工作..任何对象被保留应该有一个奖励加上1个保留计数......一个对象只有在它的保留计数变为零时才会被释放..

于 2011-08-05T11:54:36.400 回答
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通过 setter 调用,它保留、复制或分配theAppDataObject. 在这种情况下,我们可以假设它很有可能被保留。

为什么我们稍后访问这个对象时不会得到 nil 呢?

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

于 2011-08-05T12:04:36.197 回答