init,alloc和retain以及“永远不会读取初始值”

时间:2011-10-03 07:52:58

标签: objective-c ios

我已经使用静态分析器查看我的代码并得出以下问题。

NSString *string = [[NSString alloc] init];
string = [object name];

这给我一个内存错误,说永远不会读取初始值。 我用以下

替换了它
NSString *string = [[object name]retain];

这是更好/正确的编码吗?

干杯

3 个答案:

答案 0 :(得分:3)

此代码:

1: NSString *string = [[NSString alloc] init];
2: string = [object name];

不正确,因为在行 1:中您在变量string中分配新内存并存储对它的引用。在 2:行中,您将变量string存储在另一个内存位置。

因此,您没有读取在行 1:分配的内存值,甚至没有release。所以你还有内存泄漏。

如果您想保存对内存中某个位置的引用,则不需要alloc+init。如果要在内存中分配一些空间来写入数据或读取数据,则应使用alloc+init

答案 1 :(得分:3)

您的变量string实际上是NSString对象的指针。代码的第一行创建了一个新的空字符串,并将指针指向string。然后第二行代码立即用指向完全不同的字符串的指针覆盖该指针。您从未读过原始值,也无法访问已分配的NSString,因此已泄露。

第二个选项是正确的,只要您稍后在某处释放/自动释放它。

答案 2 :(得分:2)

我见过其他人做过这件事。 NSString *string = [[NSString alloc] init];创建一个新对象并将其分配给字符串。 string = [object name];object的名称分配给字符串。它类似于int a = 0; a = 404没有影响。您的代码的问题是[[NSString alloc] init]创建一个保留计数为1的新对象,因为您没有释放它泄漏。 [object name]返回一个自动释放的对象,该对象将在runloop的末尾消失。

简而言之,请使用NSString *string = [[object name] retain];