您的位置:首页 > 移动开发 > IOS开发

我的iOS学习历程 - OC第九天

2015-11-06 17:24 316 查看
今天主要讲的是内存的管理方法

1.IOS的内存管理中 Mac是使用的垃圾回收(gc) 有轮询延迟

手机用的是 引用计数

2.引用计数的方法:

( 1 ) alloc

alloc 开辟空间引用计数
从0 ->1
Person *p1 = [[Person alloc]initWithName:@"wanglong" age:18];


( 2 ) retain

retain 使用引用计数 +1
Person *p2 = [p1 retain];


( 3 ) retainCount
计数的数字

NSLog(@"%ld",[p3 retainCount]);


( 4 ) release

release 影响引用计数 -1,
当对象的引用计数为0 的时候,该对象就会被系统释放
[p1 release];


(5) autorelease

autorelease 在未来的某一时刻引用计数
会自动-1
autorelease 需要自动释放池去-1
autorelease 是要依托自动释放池去释放的
出了自动释放池 相当于系统会给释放池中间调用了autorelease对象发送一个
release消息
自动释放池:

@autoreleasepool {
[p1 autorelease];// 相当于一个栈 出入池跟出入栈一个道理
}

for (int i = 0; i < 10; i++) {
Person *p = [[Person alloc]initWithName:@"Curry" age:21];
@autoreleasepool {//  释放池加在里面好 如果i< 很大的数就可能内存溢出
[p autorelease];
}
}
注意:类方法,便利构造器方法 使用autorelease,其他方法需要再外部释放,是一个规范

( 6 ) copy

实现拷贝协议中的方法,需要满足NSCoping协议
copy方法对引用计数的影响要看你是怎么想法的,看你怎么实现copyWithZone方法
伪拷贝 拷贝完还是一个对象(直接返回)
- (id)copyWithZone:(NSZone *)zone{
//  浅拷贝
//  拷贝后 有两个对象 但是他们的值是同一个值 引用计数变化 被拷贝的对象不变 拷贝出来的新对象从0->1
//  深拷贝 拷贝出新对象 并且 对象值也重新拷贝一份再赋值
//  对字符串进行拷贝 拷贝的结果 要看字符串这个类如何实现的拷贝方法 对不可变字符串的拷贝 其实相当于 直接retain一次
//  可变字符串 拷贝时 就是真拷贝了一个新的出来
NSString *str = [_name copy];
Person *p = [[Person alloc ]initWithName:str age:_age];
//  这叫做伪拷贝(直接返回)
return p;

}


( 7 ) dealloc

书写规范 一定要写在类的最上面,系统自动调用
如果重写的话:
-(void)dealloc
{
//  如果要写东西都写在[super dealloc]上面,防止出现野指针情况
//  如果重写dealloc方法 必须要调用父类的方法
//  保证 对象可以被释放
[super dealloc];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: