我正在读取来自“XMLReader”类的XML文件,我从app delegate创建并调用该类。在XMLReader类中,我正在创建一个“AppState”对象,其中包含XML中读取的数据。 XMLReader在创建AppState类时自动释放它。完成XMLReader后,app委托将AppState实例分配给它自己的变量,保留它并释放XMLReader类。 app delegate中的代码如下所示:
XMLReader *xmlReader = [[XMLReader alloc] init];
[xmlReader parseXMLData: data];
appState = xmlReader.appState; // <== xmmReader creates appState with autorelease
[appState retain];
[xmlReader release];
我有点不清楚是否存在一个约定,你不需要在分配对象的类中保留已分配的对象。在这种情况下,由于自动释放需要它 - 如果我不在应用程序委托中保留它,应用程序崩溃。有没有更好的办法?例如我可以在委托中创建AppState并将其设置在XML阅读器上。这样,alloc和release可以在同一个类中。这种做法的典型方法是什么?
答案 0 :(得分:1)
有一种更好的方法 - 只需为appState对象创建一个(retain)@property,合成它并将xmlReader.appState分配给self.appState。
这将保留新值并将其分配给您的appState对象。
然后您可以在App委托的dealloc方法中将其释放/设置为nil。
@interface XXX : AppDelegate
{
}
@property (nonatomic, retain) XXXXX appState
并实施
@implementation XXX
@synthesize appState;
然后用
分配self.appState = xmlReader.appState;
答案 1 :(得分:1)
如果您将appState
作为班级的属性,则可以使用以下方式分配给它:
self.appState = xmlReader.appState;
合成的setter方法将自动保留它(假设您将属性声明为retain
,或者,如果appState
是字符串,则将属性声明为{{1}也是常规的})。