iPhone alloc和发布
我是ObjC和iPhone的新手 我下载了一个在多个视图之间共享数据的示例。基本方法是在基本UIApplication中创建数据模型对象,并从中获取/设置数据。因此,在init方法中,我看到了以下代码: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]; } 然后,使用委托
- (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。因此,您可以释放对象的所有权。