关于retain release autorelease
来源:互联网 发布:wps数据透视图 编辑:程序博客网 时间:2024/05/02 02:55
1.retain之后count的确加一。alloc之后count就是1,release就会调用dealloc销毁这个对象。
如果retain,的确需要release两次。通常在method中把参数赋给成员变量时需要retain。
例如:
ClassA有setName这个方法:
-(void)setName:(ClassName*) inputName
{
name = inputName;
[name retain]; //此处retian,等同于[inputName retain],count等于2
}
调用时:
ClassName *myName = [[ClassName alloc] init];
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,在ClassA的dealloc中release name才能真正释放内存。
2.autorelease更加tricky,而且很容易被它的名字迷惑。我在这里要强调一下:autorelease不是garbage collection,完全不同于Java或者.Net中的GC。
autorelease和作用域没有任何关系!
autorelease原理:
1.先建立一个autorelease pool
2.对象从这个autorelease pool里面生成。
3.对象生成之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
4.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。
上面这个例子应该这样写:
ClassName *myName = 【[[ClassName alloc] init] autorelease];//标记为autorelease
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否则release pool时会release这个retain count为0的对象,这是不对的。
记住一点:如果这个对象是你alloc或者new出来的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain count始终为1)。
如果retain,的确需要release两次。通常在method中把参数赋给成员变量时需要retain。
例如:
ClassA有setName这个方法:
-(void)setName:(ClassName*) inputName
{
}
调用时:
ClassName *myName = [[ClassName alloc] init];
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,在ClassA的dealloc中release name才能真正释放内存。
2.autorelease更加tricky,而且很容易被它的名字迷惑。我在这里要强调一下:autorelease不是garbage collection,完全不同于Java或者.Net中的GC。
autorelease和作用域没有任何关系!
autorelease原理:
1.先建立一个autorelease pool
2.对象从这个autorelease pool里面生成。
3.对象生成之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
4.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。
上面这个例子应该这样写:
ClassName *myName = 【[[ClassName alloc] init] autorelease];//标记为autorelease
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否则release pool时会release这个retain count为0的对象,这是不对的。
记住一点:如果这个对象是你alloc或者new出来的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain count始终为1)。
- 关于retain release autorelease
- 关于retain release autorelease 转载一个评论
- cocos2d 关于retain、release以及autorelease
- 关于Cocos2dx的retain\release\autorelease的理解
- Objective-C - retain release autorelease
- Objective-C - retain release autorelease
- autorelease release retain何时被调用
- retain、copy、assign、release、autorelease、nonatomic、atomic
- Objective-C - retain release autorelease assign copy
- Cocos2dx-内存管理机制(autorelease、release、retain)
- 内存管理 release retain autorelease 的简单原则
- @property后面的retain, assign, copy, autorelease, release作用是什么?
- Cocos2d-x 内存管理中retain() 、autoRelease()、release()
- Cocos2d-x 内存管理中retain() 、autoRelease()、release()
- Cocos2d-x 内存管理中retain() 、autoRelease()、release()
- cocos2d-x的内存管理机制release(),retain(),autorelease()
- 内存管理: alloc, retain, release, autorelease, copy, assign
- oc MRC内存管理机制alloc/retain/copy/release/autorelease
- Python线程指南
- linux中断处理体系结构
- 深度探索C++对象模型笔记(七)
- wireshark用户手册中文版在线
- ASP.NET应用程序管理状态
- 关于retain release autorelease
- Linux必学的60个命令
- 2013年中国政府网站绩效评估指标体系设计说明
- linux 关机,重启命令
- JAVA unix / Win OS / 文件目录创建、删除 和 目录权限(file permission)
- Linux必学的60个命令(3)-系统管理
- mysql explain详解
- 删除代码中的注释
- Linux实用技巧