随意细解:OC -- 内存管理高级
2015-11-07 21:05
232 查看
内存管理高级
属性的内部实现原理
assignsetter方法:
- (void)setName:(NSString *)name { _name = name; }
getter方法:
- (NSString *)name { return _name; }
retain (copy相同)
setter方法:
- (void)setName:(NSString *)name { if (_name != name) { // 如果你对空release,相当于你什么都没做 // 如果_name不为空,将原来的值释放 [_name release]; // 对形参retain,计数加1 _name = [name retain]; } }
getter方法:
- (NSString *)name { return [[_name retain]autorelease]; }
案例分析:
NSString *stuName = [[NSString alloc]initWithFormat:@"bb"]; Student *stu = [[Student alloc]initWithName:@"aa"]; stu.name = stuName; [stuName release]; NSString *name = [[NSString alloc]initWithFormat:@"dj"]; stu.name = name; [name release]; [stu release];
学生类的.m文件:
-(void)dealloc { [_name release]; [super dealloc]; }
dealloc内释放实例变量
举例:有Student类,类中有name属性main函数中:
NSString *stuName = [[NSString alloc]initWithFormat:@"bb"]; Student *stu = [[Student alloc]initWithName:@"aa"]; stu.name = stuName;
这时:stu的计数为1,stuName的计数为2。(init之后为1,调用retain属性的name的set方法, ‘ _name = [name retain]; ’方法中name的计数加1,这里是stuName的计数加1,所以stuName的计数为2)
[stuName release]; [stu release];
这时,stu的计数为0,系统自动调用dealloc方法。但是stuName经release之后计数为1,没有释放,产生内存泄露。所以我们在dealloc方法中要release一下stuName。在类中重写dealloc方法:
-(void)dealloc { [_name release]; [super dealloc]; }
便利构造器方法的实现原理
举例:有Student类,类中有name属性Student.h文件:
+ (instancetype)studentWithName:(NSString *)name;
Student.m文件:
+ (instancetype)studentWithName:(NSString *)name { Student *s = [[Student alloc]initWithName:name]; return [s autorelease]; }
调用autorelease方法,在自动释放池结束时释放对象。
collection的内存管理
collection就是NSArray,NSDictionary,NSSet…等容器类。collection会⾃主管理⾃⼰内部的元素。加⼊collection中的对象会被retain,移除出collection的对象会被release,collection被释放会对内部所有对象release。举例:数组
Person *p1 = [[Person alloc]init]; Person *p2 = [[Person alloc]init]; Person *p3 = [[Person alloc]init]; // 数组在添加元素时,如果你把一个元素添加到容器类的对象中(数组、字典、集合中),那么系统将自动给数组中的元素发送retain消息,从而使数组中的元素引用计数+1 NSArray *arr = [[NSArray alloc]initWithObjects:p1,p2,p3, nil]; [p1 release]; [p2 release]; [p3 release]; // 数组在释放时,如果数组释放时,那么在释放之前,系统会自动给数组中的每一个元素发送一个release消息,从而使数组中的元素引用 -1 [arr release];
相关文章推荐
- POJ - 1065 Wooden Sticks
- OC-类方法
- ZOJ2972-Hurdles of 110m
- Spark入门之五:SparkSQL的原理以及架构
- 【OpenCV】有关内存释放的一些问题
- mongodb(Windows)安装、测试
- PB开发的应用程序自动发出对sys.ALL_SYNONYMS查询的问题。
- uva 1312——Cricket Field
- java保留两位小数
- 蛮力法之最近对问题(C实现)
- 算法题——不创建临时变量求一个字符串的长度
- Delegate 设计模式
- div的高度设置
- 模仿UITableView的WaterFlowView和控件的懒加载
- 各个版本matlab下载地址
- 《JavaScript DOM编程艺术》笔记
- 创建XML--从小的节点开始
- 学计算机的方向
- Nodejs简单的初始安装、部署Window版
- Latent semantic analysis note(LSA)