【问题标题】:Memory allocation design question内存分配设计题
【发布时间】:2011-03-06 20:17:43
【问题描述】:

我正在从“XMLReader”类中读取 XML 文件,该类是我从应用程序委托创建和调用的。在 XMLReader 类中,我创建了一个“AppState”对象,其中包含在 XML 中读取的数据。 XMLReader 在创建 AppState 类时自动释放它。 XMLReader 完成后,应用程序委托将 AppState 实例分配给它自己的变量,保留它,然后释放 XMLReader 类。应用委托中的代码如下所示:

XMLReader *xmlReader = [[XMLReader alloc] init];

[xmlReader parseXMLData: data];

appState = xmlReader.appState; // <== xmmReader creates appState with autorelease

[appState retain];

[xmlReader release];

我有点不清楚是否有一个约定,您不需要在分配对象的类中保留分配的对象。在这种情况下,由于自动释放,它是必需的 - 如果我不在应用程序委托中保留它,应用程序就会崩溃。有没有更好的办法?例如我可以在委托中创建 AppState 并将其设置在 XML 阅读器上。这样分配和释放可以在同一个类中。这样做的典型方法是什么?

【问题讨论】:

    标签: iphone objective-c memory


    【解决方案1】:

    有一个更好的方法 - 只需为您的 appState 对象创建(保留)@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;
    

    【讨论】:

      【解决方案2】:

      如果你将appState 设为你的类的属性,那么你可以使用:

      self.appState = xmlReader.appState;
      

      合成的 setter 方法会自动保留它(前提是您将属性声明为retain,或者,如果appState 是字符串,也将属性声明为copy)。

      【讨论】:

        猜你喜欢
        • 2012-04-16
        • 1970-01-01
        • 2011-01-07
        • 2011-03-18
        • 2021-05-04
        • 2021-06-30
        相关资源
        最近更新 更多