zoukankan      html  css  js  c++  java
  • AutoReleasePool使用总结

    1.知识点

    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方法。

        self.retainView = [[[UIView alloc]init]autorelease];
        self.assignView = [[UIView alloc]init];

    2.应该使用autorelease,因为在addGestureRecognizer时会自动retain。

        UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(doTap:)]autorelease];
        tapGesture.delegate = self;
        [self.maskView addGestureRecognizer:tapGesture];

    3.应该使用autorelease,因为cell要返回继续处理(返回后应该会retain),不能直接release。

        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。

  • 相关阅读:
    菜鸟记录:如何获取LOGINVIEW控件状态模板中的子控件
    无法安装dotnetFramework35sp1的解决方法
    MOSS2007小技巧:不用SPD轻松删除错误页面上的问题Webpart
    在动态页面里象静态页面一样控制整个网页的缓存和更新
    烦人的网页iframe去除
    经典sql注入教程
    自己写的后台静态权限验证类
    Asp.net项目从Vs2003转换到Vs2005的常见问题大全及解决方法
    C# 相当于ASP里Eval中的计算公式的方法(超简单的方法)
    1 UNIX与Linux的发展
  • 原文地址:https://www.cnblogs.com/zhongriqianqian/p/3978755.html
Copyright © 2011-2022 走看看