在iPhone Xcode 3.2.5,iOS 4.2.1中分配和释放内存

时间:2011-04-10 14:12:55

标签: objective-c ios4

我遇到一个奇怪的问题,当另一个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是否为nil。如果发布的modelName已经是nil会发生什么?

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

2 个答案:

答案 0 :(得分:2)

  

我的问题是当一个人创建这样的数组时,[tempArray发布]是否会实际释放刚刚创建的数组?

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

  

同样在下面的设置例程中释放内存时,我应该在发布之前检查modleName是否为nil。发生的是一个已发布的modelName已经是nil?

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

答案 1 :(得分:1)

发布不符合您的想法 - 它不等同于free()或delete,并且不会导致内存消失。

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

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