gpt4 book ai didi

objective-c - 释放后将对象设置为 nil -- TT_RELEASE_SAFELY

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:35 26 4
gpt4 key购买 nike

我已经开始研究 Three20,我有一个关于 TT_RELEASE_SAFELY 的简单问题到目前为止,我喜欢这样写代码:

UILabel *lab = [[UILabel alloc] initWithFrame:rect];
[self.view addSubview:lab];
[lab release];

这里我认为主池负责释放lab的内存。

现在我找到了这样定义的 TT_RELEASE_SAFELY:

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }

如您所见,释放后,它将对象设置为nil

我想知道这两种方式的区别,哪种方式更好。

谢谢。

最佳答案

Sending a message to nil在 Objective-C 中有效。向释放的对象发送消息不是。

向释放的对象发送消息:

id obj = [[MyClass alloc] init];
[obj release];
[obj doSomething]; // Crash!

向 nil 发送消息:

id obj = [[MyClass alloc] init];
[obj release], obj = nil;
[obj doSomething]; // Valid

在对象被释放后将 nil 分配给变量是有争议的,因为它可以防止您意识到某些地方是错误的。稳重外星人的例子:

[controlCenter dealloc];
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];

此代码将崩溃,因为 controlCenter 已被释放。因此,该缺陷将被及早发现并修复。

[controlCenter dealloc], controlCenter = nil;
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];

此代码会将 0.0 分配给 timeLeft,这似乎是一个有效的等待时间,即使 controlCenter 为 nil。


对上述内容持保留态度,因为如果您正在编写 Objective-C 应用程序,您可能更关心通过避免崩溃而不是破坏城市来让用户满意。如果后者是一个问题,您可能应该使用像 Ada 这样的类型安全语言。

关于objective-c - 释放后将对象设置为 nil -- TT_RELEASE_SAFELY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5972646/

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