1

保留和自动释放问题。

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

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

这两个代码没有区别吗?

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

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

4

4 回答 4

3

对于第一个示例,它们非常不同。在第一个代码块中,给 temp 的 UIView 的保留计数为 1(感谢alloc)。当您在第三行释放它时,MyView 变量现在是错误的,因为该对象可能会被破坏。如果您希望 MyView 保留它,请执行以下操作:

MyView = [temp retain];

第一个示例的第二部分将创建一个全新的 UIView 实例,它与temp.

在第二个示例中,该stringWithString方法将autorelease您的字符串,这意味着它会在“释放池”被释放时自动为您释放,很久以后。您不必担心释放它。然而,在第二行中,字符串是静态分配的。保留计数和释放对它们来说是完全没有必要的。

忘了提...查看这个问题的答案,了解更多关于保留/释放规则的信息。

于 2011-01-19T16:16:28.697 回答
0

第一部分:不一样!

MyView 也将被释放,因为您只是在复制指针(保留计数 0)。在第二个代码中,MyView 的保留计数为 1。


第二部分:基本相同。

于 2011-01-19T16:17:15.557 回答
0
  1. 请记住,引用 MyView 只是指向 temp。因此,一旦您释放 temp,这也会影响 MyView。

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

A:

NSString *string = someOtherString; // 复制对 someOtherString 的引用;

乙:

NSString *string = [NSString stringWithString: someOtherString]; // 复制另一个字符串。

于 2011-01-19T16:17:48.247 回答
0

一件有用的事情是,您可以 NSLog 保留计数,以便您可以自己进行测试。

但是回到你的问题......

如果 MyView 是一个属性,并且您已经使用 self.MyView 引用了它并且它是使用保留或复制声明的,那么您的 2 个语句是相同的。如果 MyView 只是一个局部变量,你的 UIView 将在你这样做时释放

[temp release];

因为自从分配保留计数以来,您没有做任何事情来增加保留计数。

对于您的字符串示例...

[NSString stringWithString:@"Hello"];

返回一个自动释放的字符串。如果您需要将其保留很长时间,则需要保留它。

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

于 2011-01-19T16:18:09.367 回答