基本保留,自动释放问题

时间:2011-01-19 16:04:01

标签: iphone objective-c ios retain autorelease

保留并自动发布问题。

// A
UIView *temp = [[UIView alloc] init];
myView = temp;
[temp release];

// B
myView = [[UIView alloc] init];

这两个代码没有差异吗?

NSString *str = [NSString stringWithString:@"Hello"];
NSString *str = @"Hello";

这两个?我还不确定保留计数。谢谢。

4 个答案:

答案 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)

  1. 请记住,引用MyView只指向temp。因此,一旦释放temp,这也会影响MyView。

  2. [NSString stringWithString:]主要用于复制其他字符串而不是引用内存地址。 E.g:

  3. 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"];

返回一个自动释放的字符串。如果你需要保留很长时间,你会想要保留它。

第二个字符串示例是静态分配的字符串,您不必担心它。保留计数不适用于他们。