1、引用计数
IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计.
alloc 对象分配后引用计数为1
retain 对象的引用计数+1
copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变
release 对象引用计数-1 如果为0释放内存
autorelease 对象引用计数-1 如果为0不马上释放,最近一个个pool时释放
内存管理的原则就是最终的引用计数要平衡,
如果最后引用计数大于0 则会内存泄露
如果引用 计数等于0还对该对象进行操作,则会出现内存访问失败,crash 所以尽量设置为nil
这两个问题都很严重,所以请一定注意内存释放和不用过后设置为nil
2、成员变量与属性
在一个函数里调用另一个函数分配的变量这时候
有两个选择: 类成员变量和使用属性
@interface TestMem: NSObject {
TestObject *m_testObject ; // 成员变量
TestObject *testObject; //成员变量
}
成员变量与上面的内存管理是一致的,只是在不同的函数里要保持引用计数加减的平衡
所以要你在每次分配的时候检查是否上次已经分配了。是否还能调用
什么时候用属性?
1. 把成员做为public.
2. outlet 一般声明为属性( 这个内存于系统控制,但我们还是应该做一样操作,后面会讲)
3. 如果很多函数都需要改变这个对象 ,或这个函数会触发很多次,建议使用属性。我们看看属性函数展开后是什么样子:
// assign
-(void)setTestObject :(id)newValue{
testObject= newValue;
}
// retain
-(void)setTestObject :(id)newValue{
if (testObject!= newValue) {
[testObject release];
testObject= [newValue retain];
}
}
// copy
-(void)setTestObject :(id)newValue{
if (testObject != newValue) {
[testObject release];
testObject = [newValue copy];
}
}
asssign 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
retain 相当于对原对象的引用计数加1
copy 不对原对象的引用计数改变,生成一个新对象引用计数为1
注意:
self.testObject 左值调用的是setTestObject 方法. 右值为get方法,get 方法比较简单不用说了
而 真接testObject 使用的是成员变量
self.testObject = [[testObject alloc] init]; // 错 reatin 两次
testObject = [NSArray objectbyindex:0]; 不安全,没有retain 后面release会出错,如果testObject已有值也会mem leak
3、自动管理对象
IOS 提供了很多static(+) 创建对象的类方法,这些方面是静态的,可以直接用类名
调用如:
NSString *testString = [NSString stringWithFormat:@"test" ];
testString 是自动管理的对象,你不用relese 他,他有一个很大的retain count, release后数字不变
4、特例
有一些通过alloc 生成的对象相同是自动管理的如:
NSString *testString = [[NSString alloc] initWithString:@"test1"];
retain count 同样是很大的数,没办法release
但为了代码对应,还是应该加上[ testString release];
不然xcode的Analyze 会认识内存leak, 但Instruments leak 工具检测是没有
阅读(1119) | 评论(0) | 转发(0) |