【问题标题】:Allocating and releasing memory in iPhone Xcode 3.2.5, iOS 4.2.1在 iPhone Xcode 3.2.5、iOS 4.2.1 中分配和释放内存
【发布时间】:2011-04-10 14:12:55
【问题描述】:

当另一个 ViewController 来来去去时,我遇到了一个奇怪的问题,即 tableview 显示 (null)。我追踪到它读取数据以显示到 tableview 的地方,发现它读取的数据为 null。要对此进行调试,我需要了解内存管理对 iPhone 的真正作用。我在我的应用程序委托中使用了以下代码来创建对象数组。这是来自我为我的应用程序修改的示例代码。我的问题是,当创建这样的数组时,[tempArray release] 是否真的会释放刚刚创建的数组?

//Initialize the hardware array.
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
self.hardwareArray = tempArray;
[tempArray release];

这种类型的代码在 iPhone 上似乎很常见。例如,教程一直在说,现在您将数据传递给控制器​​,您可以释放它。但是我的 C 和 C++ 经验告诉我,如果你释放内存,它就会消失,如果它的地址位于堆栈上的某个位置,那就不好了。是数据被复制到另一个地方而不是地址被传递?

此外,在像下面这样的设置例程中释放内存时,我是否应该在释放它之前检查 modleName 是否不为零。如果一个已发布的 modelName 已经为 nil 会怎样?

-(void) setModelName:(NSString *)newValue {
    self.isDirty = YES;
    [modelName release];
    modelName = [newValue copy];
}

【问题讨论】:

    标签: objective-c ios4


    【解决方案1】:

    我的问题是,当创建这样的数组时,[tempArray release] 是否真的会释放刚刚创建的数组?

    如果对象的@propertyassign,它将被释放。但通常你使用retaincopy 作为@property。如果属性为retain,则使用self.hardwareArray = ...(即[self setHardwareArray:...])调用的setter 将保留该对象。如果属性是副本,它将创建一个已保留的新对象。

    此外,在像下面这样的设置例程中释放内存时,我是否应该在释放它之前检查 modleName 是否不为零。一个已发布的 modelName 已经为 nil 会发生什么?

    在 Objective-c 中,发送给 nil 的消息是完全合法的。无需担心,无需检查 nil。
    如果你在dealloc 之外释放一个实例变量,你应该在释放它之后将它设置为 nil。

    【讨论】:

      【解决方案2】:

      release 不会像你想的那样做——它不等同于 free() 或 delete 并且不会导致内存消失。

      在进行任何编码之前,充分理解一些简单的内存管理规则非常重要。不难,最好的资源是Apple Developer Guides,像这样一个

      http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html%23//apple_ref/doc/uid/10000011i

      【讨论】:

        猜你喜欢
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多