例如:
{
nssstring * samplestring ;
samplestring = [[nsstring alloc]init];
samplestring = [[nsstring alloc]init];
}
在这个代码block
执行之后,采样字符串在第一次分配时所指向的内存地址是否是一个泄漏?
这是正常的还是错误的编码实践。此块执行后ARC如何处理第一次内存分配。
2.上述代码与
{
nssstring * samplestring;
samplestring = [[nsstring alloc]init];
samplestring = nil;
}
Nil
是一个对象。对吧?因此,在这里,第一个samplestring
内存分配似乎与1中的代码块类似,或者nil
在内存管理方面有特殊的意义。
最后,如果我想使用相同的对象名称,应该遵循1或2。
我是从我的手机问这个问题,所以请原谅格式化,以防这是一个副本。
发布于 2014-01-14 09:32:18
如果您正在使用ARC,那么这两种情况中的任何一种都没有泄漏。
在第一个示例中,您创建了一个指针。然后在内存中创建一个对象,并告诉指针指向它。然后在内存中创建另一个对象(位于不同的内存位置),并告诉指针指向它。弧线将看到没有任何指向第一个分配,并标记为垃圾和可重用的内存位置。根据对象的指向或不指向( retian计数为1或更多),are为您添加retain]
和release
调用。
您的第二个例子几乎是一样的。创建一个指针。然后创建一个对象并让指针指向它。然后让指针指向零(零)。在这一点上,您没有指向您创建的内存位置,ARC看到这一点,并将内存标记为垃圾/可重用。
在某些方面,第二个示例更好,因为当您使用xcode运行analyze时,它会看到您将指针设置为零,如果没有重新分配,那么它的任何进一步使用都将被标记为错误(如果它们最初不会导致应用程序崩溃)。但这真的是个意见问题。
发布于 2014-01-14 09:29:17
对于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
不是一个对象,它是一个零指针,即指向任何东西的指针。
https://stackoverflow.com/questions/21119863
复制相似问题