[英]Objective-C / iOS Memory Management Questions
我有兴趣了解更多有关iOS中内存管理的实现和正确使用的信息,尤其是Objective-C。
-release
对象时,什么时候内存才真正释放出来并可供其他人使用? -retain
和-release
消息插入/综合到代码中(在编译过程中或其他时间发生)? autorelease
的正确用法和目的还不确定。 例如,当编写返回数组的方法时,我通常在函数的开头-alloc
和-init
该数组,然后在结尾处return
它。 例如:
- (NSArray *)myMethod {
NSMutableArray *theArray = [[NSMutableArray alloc] init];
// Do other stuff here
return theArray;
}
我是否也应该-autorelease
该数组? 例如:
- (NSArray *)myMethod {
NSMutableArray *theArray = [[NSMutableArray alloc] init];
// Do other stuff here
return [theArray autorelease];
}
[NSArray array]
)上使用便捷构造函数,而不是-alloc
和-init
对象? strong
的属性时,应该将其分配给一个中间变量而不是直接分配给该属性,以避免双重保留(一次在-alloc
和-init
,然后再次在分配给strong
财产)? 例如,我应该这样做:
NSMutableArray *theNewArray = [[NSMutableArray alloc] init];
self.newArray = theNewArray;
而不是这样:
self.newArray = [[NSMutableArray alloc] init];
在此先感谢您对这些问题的任何帮助!
释放对象后,其他人就可以使用该内存。 后者发生在其保留计数达到0时,也就是说,每次保留都会释放一次。
在Objective-C中有一个命名约定,只要您调用一个名称中标有“ alloc”,“ copy”或“ new”的方法,您就拥有已创建的对象,并且有责任在一段时间内释放它后来。 此外,当您调用一个以您要接收的东西的名称开头的方法(例如,工厂方法,例如[NSString stringWithFormat:],[NSDate日期]等)时,返回的对象将始终自动释放,意味着您不必担心释放它。
这些命名规则变得非常重要,并且得到了很好的遵守,当ARC出现时,Apple能够在ARC本身中构建它们。 因此,在编译期间,ARC会在正确的位置为您插入发布,自动发布和保留。
自动释放将某个对象标记为稍后再释放(在下一个运行循环中),而不是像常规释放那样立即释放。 该对象将与其他也已自动释放的对象一起添加到自动释放池中。 在ARC之前,从方法返回您拥有所有权(即通过alloc,copy或new创建)的对象时,将使用autorelease。 如果只是正常释放它,则该对象可能会在调用函数可以使用之前被释放。 使用ARC,您不必担心任何这些东西,而可以直接返回对象。
有时工厂时间更方便。 [NSString stringWithFormat:]使您可以初始化通过占位符的字符串。 [NSDate date]返回您已经初始化的当前日期。 如果在这种情况下分配/初始化,则必须再增加一两行代码才能获得相同的结果。 在具有ARC的世界中,在这些情况下的内存管理实际上不再重要。
不用担心。 您可以直接分配它。 编译器将优化保留/释放。
release
对象时,其保留计数会减少。 当其保留计数达到0时,它将被释放; autorelease
(i)将对象添加到自动释放池; (ii)释放它。 因此,它将终止您对对象的所有权,但确保其生存期至少与当前池一样长。 如果您拥有自己的引用(来自新的,分配,保留或创建的引用),则应确保将其释放。 如果您需要释放它又返回它,则应该自动释放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.