繁体   English   中英

基本保留,自动发布问题

[英]Basic retain, autorelease question

保留并自动发布问题。

// 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。


第二部分:基本相同。

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

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

A:

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

B:

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

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

但是回到您的问题...

如果MyView是一个属性,并且您使用self.MyView引用了它,并且使用了keep或copy进行了声明,则您的2条语句是相同的。 如果MyView只是一个局部变量,则当您执行此操作时,您的UIView将取消分配

[temp release];

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

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

[NSString stringWithString:@"Hello"];

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM