AutoReleasePool使用总结
1.知识点
1 2 3 4 5 | int main( int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil , NSStringFromClass ([AppDelegate class ])); } } |
1.在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下可以理解为:当此APP的代码在持续运行时,自动释放池是不会被销毁的,这段时间内可以安全地使用自动释放的对象;当APP的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。
2.当在主线程外开启其它线程时,系统只会在主线程中自动生成并销毁掉自动释放池。
2.例子
1.正常情况,属性为retain的应该使用autorelease,因为set方法会自动调用retain;属性为assign的不能使用。注意,只用使用self.retainView才会调用set方法,如果使用_retainView,则直接对内存赋值,不会调用set方法。
1 2 | self .retainView = [[[UIView alloc]init]autorelease]; self .assignView = [[UIView alloc]init]; |
2.应该使用autorelease,因为在addGestureRecognizer时会自动retain。
1 2 3 | UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (doTap:)]autorelease]; tapGesture.delegate = self ; [ self .maskView addGestureRecognizer:tapGesture]; |
3.应该使用autorelease,因为cell要返回继续处理(返回后应该会retain),不能直接release。
1 2 3 4 5 | cell = [tableView dequeueReusableCellWithIdentifier:@ "cell" ]; if (cell == nil ){ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@ "cell" ] autorelease]; } return cell; |
4.类级构造方法会自动调用autorelease,比如[NSMutableArray array]。如果此array为cell的内容,则正常加载cell没问题,加载完以后会随着autoreleasepool的释放被release。因此如果再刷新cell则会出错(比如上下滚动tableView)。因此要retain一次,或者使用对象级构造方法alloc。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步