2011-04-10 31 views
2

我有一个奇怪的问题,显示(空),当另一个ViewController来来去去。我将它追溯到它读取要显示给tableview的数据的地方,并发现它读取的数据为空。为了调试这个,我需要了解内存管理如何真正适用于iPhone。我在我的应用程序委托中使用了下面的代码来创建一个对象数组。这是来自我为我的应用修改的示例代码。我的问题是,当一个像这样创建一个数组时,[tempArray release]是否会释放刚创建的数组?分配和释放内存在iPhone Xcode 3.2.5,iOS 4.2.1

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

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

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

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

回答

2

我的问题是,当一个创建一个这样的数组,将在[tempArray发行]实际上释放刚创建的阵列?

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

此外,当释放内存设置例程如下所示,我应该检查,看看如果modleName是不是零,然后释放它。发生了什么事是一个释放modelName已经是零?

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