例如:
{
nssstring * samplestring ;
samplestring = [[nsstring alloc]init];
samplestring = [[nsstring alloc]init];
}
在执行此代码block
后,第一次分配时samplestring指向的内存地址是否泄漏?
这是正常还是不良编码做法。 在执行此块操作后,ARC如何处理第一个内存分配。
2.以上代码如何与
不同{
nssstring * samplestring;
samplestring = [[nsstring alloc]init];
samplestring = nil;
}
Nil
是一个对象。对 ?因此,似乎第一个samplestring
内存分配的行为与1中的代码块类似。或nil
在内存管理中具有特殊意义。
最后,如果我想使用相同的对象名,我应该遵循1或2。
我正在通过手机询问这个问题,请原谅格式化,如果这是重复的话。
答案 0 :(得分:2)
对于1,当您重新分配对象指针时,ARC将销毁旧对象。同样,如果对象超出范围,它将被销毁
{
NSString * samplestring ;
samplestring =[ [nsstring alloc]init]; // first object created
samplestring =[ [nsstring alloc]init]; // first destroyed, second created
} // second object destroyed
对于2,这几乎是相同的故事,除了当符号超出范围时没有什么可以破坏:
{
NSString * samplestring;
samplestring =[ [nsstring alloc]init]; // first object created
samplestring =nil; // first object destroyed
}
至于最后如果我想使用相同的对象名称,我应该遵循1或2。,这并不重要,但是2.由于ARC将正确管理对象生存期,因此是多余的
最后,nil
不是一个对象,它是一个 nil指针,即一个指向任何东西的指针。
答案 1 :(得分:1)
如果您使用ARC,那么这两种情况都不会泄漏。
在第一个示例中,您将创建一个指针。然后在内存中创建一个对象并告诉指针指向它。然后在内存中创建另一个对象(在不同的内存位置)并告诉指针指向它。 ARC将看到没有任何内容指向第一个分配,并将内存位置标记为垃圾和可重用。 ARC根据指向或不指向对象(retian计数为1或更多)为您添加retain]
和release
调用。
你的第二个例子几乎是一样的。你创建一个指针。然后你创建一个对象并告诉指针指向它。然后你告诉指针指向什么(零)。此时,您没有指向您创建的内存位置,ARC看到并将内存标记为垃圾/可重用。
在某些方面,第二个示例更好,因为当您使用xcode运行analyze时,它会看到您将指针设置为nil,并且在没有重新分配的情况下进一步使用它将被标记为错误(如果它们不会导致您的应用程序崩溃的第一个位置)。但这确实是一个意见问题。