我已经使用静态分析器查看我的代码并得出以下问题。
NSString *string = [[NSString alloc] init];
string = [object name];
这给我一个内存错误,说永远不会读取初始值。 我用以下
替换了它NSString *string = [[object name]retain];
这是更好/正确的编码吗?
干杯
答案 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 = 4
,0
对4
没有影响。您的代码的问题是[[NSString alloc] init]
创建一个保留计数为1的新对象,因为您没有释放它泄漏。 [object name]
返回一个自动释放的对象,该对象将在runloop的末尾消失。
简而言之,请使用NSString *string = [[object name] retain];