保留并自动发布问题。
// A
UIView *temp = [[UIView alloc] init];
myView = temp;
[temp release];
// B
myView = [[UIView alloc] init];
这两个代码没有差异吗?
NSString *str = [NSString stringWithString:@"Hello"];
NSString *str = @"Hello";
这两个?我还不确定保留计数。谢谢。
答案 0 :(得分:3)
对于第一个例子,它们非常不同。在第一个代码块中,赋予temp的UIView的保留计数为1(感谢alloc
)。当你在第三行释放它时,MyView变量现在很糟糕,因为该对象可能被销毁。如果您希望MyView保留它,请执行:
MyView = [temp retain];
第一个例子的第二部分将创建一个全新的UIView实例,它与temp
无关。
在第二个示例中,stringWithString
方法将autorelease
您的字符串,这意味着在“发布池”发布后,它会自动为您释放。你不必担心释放它。但是,在第二行中,字符串是静态分配的。他们完全不需要保留计数和释放。
忘记提及...查看the answer to this question了解有关保留/释放规则的更多信息。
答案 1 :(得分:0)
第一部分:它不一样!
MyView也将被释放,因为你只是复制指针(保留计数0)。 在第二个代码中,MyView将保留计数为1。
第二部分:它基本相同。
答案 2 :(得分:0)
请记住,引用MyView只指向temp。因此,一旦释放temp,这也会影响MyView。
[NSString stringWithString:]主要用于复制其他字符串而不是引用内存地址。 E.g:
A:
NSString * string = someOtherString; //将引用复制到someOtherString;
B:
NSString * string = [NSString stringWithString:someOtherString]; //制作另一个字符串的副本。
答案 3 :(得分:0)
一个有用的事情是,您可以通过NSLog记录零售额,以便您可以自己进行测试。
但回到你的问题......
如果MyView是一个属性,并且您使用self.MyView引用它,并且它是使用retain或copy声明的,那么您的2个语句是相同的。如果MyView只是一个局部变量,那么当您执行
时,您的UIView将会释放[temp release];
因为你分配它后没有做任何事情来增加保留计数。
对于你的字符串示例......
[NSString stringWithString:@"Hello"];
返回一个自动释放的字符串。如果你需要保留很长时间,你会想要保留它。
第二个字符串示例是静态分配的字符串,您不必担心它。保留计数不适用于他们。