4.内存管理
2015-07-28 09:03
253 查看
1.Boy.h文件
#import <Foundation/Foundation.h> @interface Boy : NSObject<NSCopying> @property(nonatomic,retain)NSMutableArray *arr; @property(nonatomic,copy)NSString *name; @property(nonatomic,assign)NSInteger age; @property(nonatomic,retain)Girl *girl; - (void)setName:(NSString *)name; + (Boy *)boy; //自己定义的初始化方法 - (id)initWithName:(NSString *)name age:(NSInteger)age; //便利构造器初始化方法 + (id)boyWithName:(NSString *)name age:(NSInteger)age; @end
2.Boy.m文件
#import "Boy.h" @implementation Boy + (Boy *)boy { Boy *boy = [[Boy alloc] init]; return [boy autorelease]; } - (id)initWithName:(NSString *)name age:(NSInteger)age { self = [super init]; if (self) { //_name = name; //_age = age; //内存的优化----------------> self.name = name; _age = age;//<--->self.age = age //对象创建之后,里面的数组也会创建好,不用在外面进行创建,以免忘了造成问题 self.arr = [NSMutableArray array]; } return self; } + (id)boyWithName:(NSString *)name age:(NSInteger)age { Boy *boy = [[Boy alloc] initWithName:name age:age]; return [boy autorelease]; } //setter方法的完整版--------------> - (void)setName:(NSString *)name { //设置器里面不能对属性赋值,只能对成员变量赋值 // self.name = name; (导致死循环) //刚开始_name为nil,对nil进行release对系统而言就是一句废话不执行 if (_name != name) { [_name release]; _name = [name retain]; } //[name retain]; //[_name release]; //_name = name; } //实现NSCopying协议方法 -(id)copyWithZone:(NSZone *)zone { Boy *boy = [Boy allocWithZone:zone]; boy.name = _name; boy.age = _age; return boy; } //把成员变量里面的+1的操作全部减去 - (void)dealloc { [_name release]; [_girl release]; [super dealloc]; } @end
3.内存管理
//对象被创建出来之后的引用技术retainCount就是1 Boy *boy = [[Boy alloc] init];//--->+1 //retain对对象的引用计数+1;release对对象的引用计数-1 [boy retain];//--->+2 [boy release];//--->+1 //当对象retainCount为1时再调用release的时候,这个对象就不在对他的引用计数进行-1操作,而是直接调用dealloc方法,所以我们在访问对象的引用计数还是1 [boy release];//--->+1 //NSString的对象在全局静态区,她的引用计数为-1,代表正整数的最大值,其他的对象都在堆区 NSString *str = @"heihei";//retainCount--->-1 NSString *str = [[NSString alloc] initWithString:@"hehei"];//retainCount--->-1 //如果对象是我们进行alloc或则retain之后我门就获取了对象的所有权,就可以对对象进行release操作 //便利构造器在返回对象的时候会加上一个autorelease.所以由它创建对象不需要对内存进行管理 NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil]; NSArray *arr2 = [NSArray arrayWithObjects:@"3",@"4", nil]; [arr1 release]; //id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,用在自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去 //不可变字典可以通过mutableCopy转换成可变的数组字典 //mutableCopy出来的对象是可比变的,copy是不可变的 Boy *boy = [Boy boyWithName:@"zhangyan" age:22]; Boy *newBoy = [boy copy]; //如果自己的类(或者系统的类)想要实现copy功能,就必须遵守和实现NSCopying协议方法copyWithZone //copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原来的引用计数不变 //当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是retain一次,他的引用计数就会+1,是为了防止空指针的问题,从容器中移除时就会相应的-1 Boy *boy1 = [[Boy alloc] init];//boy1.retainCount--->+1 NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1 ,nil]; NSLog(@"%ld",[boy1 retainCount]);//--->+2
相关文章推荐
- jQuery层次选择器
- 宁波麒麟贸易集团公司化运作整体导入项目启动大会隆重举行
- G++升级
- 快快快!27个提升效率的iOS开源库推荐
- ZOJ 3888 Twelves Monkeys
- ZOJ 3885 The Exchange of Items
- 《程序员面试宝典3》大量错误(50+)纠正表
- ★经典问题—元素选择问题
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- eclipse里面INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误需要签名
- 贪吃蛇(链表指针)
- apm文件夹释义
- Ubuntu系统下的Hadoop集群(5)_Hadoop集群安装配置教程
- 像素标记法统计图像中连通域的个数
- 线程和正则表达式
- 【ZOJ】3886 Nico Number【线段树】
- 【POJ 3041】Asteroids
- 不加好友就能微信聊天?微信企业号实现了!
- android AIDL RPC 机制
- Java 编程下 Eclipse/myeclipse 如何设置单行代码显示的最大宽度