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