【发布时间】:2021-04-10 11:28:49
【问题描述】:
我是一名 C 程序员,但对 Objective-C 很陌生。类似这样的 NSString 相关代码我已经看过好几次了:
NSAppleScript* script = [[NSAppleScript alloc] initWithSource: @"<some script code>"];
...
[script release];
上面的代码显式释放了 NSAppleScript 对象,但似乎没有在任何地方释放 NSString 对象。
我想知道[script release]是否会自动完成 NSString 对象的隐式释放工作,所以我将上面的代码更改为:
NSString* scriptText = @"<some script code>";
NSAppleScript* script = [[NSAppleScript alloc] initWithSource: scriptText];
...
[script release];
//If [script release] has implicitly released scriptText,
//this would cause a repeated release.
[scriptText release];
但上面的代码运行起来也很好。这是否意味着[script release] 不会自动释放 NSObject 对象?也就是说,第一节的代码是不是泄露了NSString的释放?
【问题讨论】:
-
您应该启用已存在多年并代表您管理保留/释放的 ARC(自动引用计数)。除此之外,字符串文字被视为常量,不受引用计数的影响。
-
如果您可以过渡到 ARC,那将大大简化您的生活。但是,如果您坚持使用手动引用计数,Xcode 的“静态分析器”(shift+command+B 或 Xcode 的“产品”菜单上的“分析”)非常擅长分析代码以查找手动引用计数问题。确保从静态分析器中获得干净的健康状况。
-
你有很多很棒的答案,你应该听一听。我只想指出,在正常的 C 语言中,你会使用
alloc和free并非常小心地确保平衡它以防止泄漏。当您打开 ARC 时,这一切都会自动发生,您不必担心内存泄漏。当然,有时在特殊情况下您可能会遇到麻烦,但 ARC 大多是正确的,如果您正确使用 Objective-C(与 ARC),那么您不必担心指针的释放。所以不要试图用release代替C的free,只要打开ARC就可以开始玩了。 -
感谢您对 ARC 的有益建议,我会开启它。无论如何也可能有助于理解 ARC 隐藏的底层机制和隐含规则。
标签: objective-c nsstring