[英]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。
第二部分:基本相同。
请记住,引用MyView仅指向temp。 因此,一旦释放temp,这也会影响MyView。
[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.