我遇到一个奇怪的问题,当另一个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];
}
答案 0 :(得分:2)
我的问题是当一个人创建这样的数组时,[tempArray发布]是否会实际释放刚刚创建的数组?
如果对象的@property
为assign
,它将被释放。但通常您使用retain
或copy
作为@property
。如果属性保留,则使用self.hardwareArray = ...
(即[self setHardwareArray:...]
)调用的setter将保留该对象。如果属性是复制,它将创建一个已保留的新对象。
同样在下面的设置例程中释放内存时,我应该在发布之前检查modleName是否为nil。发生的是一个已发布的modelName已经是nil?
在objective-c中发送给nil的消息是完全合法的。无需担心,无需检查零
如果在dealloc
之外释放实例变量,则应在释放后将其设置为nil。
答案 1 :(得分:1)
发布不符合您的想法 - 它不等同于free()或delete,并且不会导致内存消失。
在进行任何编码之前,完全理解一些简单的内存管理规则非常重要。这并不难,最好的资源是Apple Developer Guides,就像这个