gpt4 book ai didi

objective-c - 在 iPhone Xcode 3.2.5、iOS 4.2.1 中分配和释放内存

转载 作者:行者123 更新时间:2023-12-04 06:29:31 25 4
gpt4 key购买 nike

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

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

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

此外,在像下面这样的设置例程中释放内存时,我是否应该在释放它之前检查 modleName 是否不为零。如果一个已发布的模型名称已经为零,会发生什么?
-(void) setModelName:(NSString *)newValue {
self.isDirty = YES;
[modelName release];
modelName = [newValue copy];
}

最佳答案

My question is when one creates an array like this, would the [tempArray release] actually release the array that was just created?



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

Also when releasing memory in a set routine like the one below, should I be checking to see if the modleName is not nil before releasing it. What happens is one released modelName that is already nil?



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

关于objective-c - 在 iPhone Xcode 3.2.5、iOS 4.2.1 中分配和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5612309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com