1.黄金法则
//OC:每个对象创建的同时会自动创建一个引用计数器.
//查看引用计数:retainCount
DiscussGroup *xiaoming = [[DiscussGroup alloc]init]; //alloc会使对象的引用计数加1 --> 1
//查看对象空间的引用计数
NSUInteger cnt0 = [xiaoming retainCount];
NSLog(@"xiaoming +1 后引用计数:%lu",cnt0);
//retain:使计数加1.
//xiaobai就拥有了对象空间的绝对使用权。xiaoming调用release不会影响xiaobai对对象的使用。
DiscussGroup *xiaobai = [xiaoming retain];
//retain使引用计数加1 --> 2
//查看对象空间的引用计数
NSUInteger cnt1 = [xiaobai retainCount];
NSLog(@"xiaobai +1 后引用计数:%lu",cnt1);
//retain之后,xiaohua也拥有对象空间的绝对使用权
DiscussGroup *xiaohua = [xiaoming retain];
//retain使引用计数加1 --> 3
//查看对象空间的引用计数
NSUInteger cnt2 = [xiaohua retainCount];
NSLog(@"xiaohua +1 后引用计数:%lu",cnt2);
[xiaoming release]; //release放弃讨论组的使用权,会使引用计数减1 --> 2
//查看对象空间的引用计数
NSUInteger cnt3 = [xiaoming retainCount];
NSLog(@"xiaoming -1 后引用计数:%lu",cnt3);
[xiaobai release]; //release会使引用计数减1 --> 1
//查看对象空间的引用计数
NSUInteger cnt4 = [xiaobai retainCount];
NSLog(@"xiaoming -1 后引用计数:%lu",cnt4);
[xiaohua release]; //release会使引用计数减1 --> 对象的引用计数就达到了理论上的0 --> 可以释放 --> 对象所在类的dealloc方法,进行释放
//查看对象空间的引用计数
NSUInteger cnt5 = [xiaoming retainCount];
NSLog(@"xiaoming -1 后引用计数:%lu",cnt5);
//new: 相当于alloc+init,但是在OC一般不用new
// DiscussGroup *xiao = [DiscussGroup new];
/*
内存管理的黄金法则:
1.凡是使用alloc/new/retain/copy(包括以copy开头的方法)/mutableCopy(包括以mutableCopy开头的方法)这五种方法,用完都要进行release(这五种方法,会引起对象的引用计数加1的操作)。
2.谁创建,谁释放。
注意:1.成员变量的释放操作,放在dealloc方法里执行。 --> 放在[super dealloc]这句话之前。
2.注意指针的转移,释放旧对象,创建新对象。
3.如果从一个对象(数组)中取出的元素需要长期使用,要进行retain操作。
*/
//内存管理:确保对象的引用计数跟使用该对象的指针数保持一致,确保对象的引用计数增加的个数和减少的个数的平衡。
//能引起计数加1的操作 --> alloc new retain copy(copy开头的方法) mutableCopy(mutableCopy开头的方法)
//能引起计数减1的操作 --> release
//autorelease并不能使对象的引用计数减1.
2.引用计数
NSMutableArray *array=[[NSMutableArray array] retain];
NSString *str=[NSString stringWithFormat:@"test"];
//NSLog(@" %@ %d",str,[str retainCount]);//1
[str retain];
// NSLog(@"%@ %d",str,[str retainCount]);//2
[array addObject:str];
//NSLog(@" %@ %d",str,[str retainCount]);//3
[str retain];
//NSLog(@" %@ %d",str,[str retainCount]);//4
[str release];
//NSLog(@" %@ %d",str,[str retainCount]);//3
[str release];
//NSLog(@" %@ %d",str,[str retainCount]);//2
[array removeAllObjects];
NSLog(@" %@ %d",str,[str retainCount]);//1
3.如果用@property声明不需要写
如果是settser方法需要写
.m中
//_engine是一个类的对象,需要考虑内存管理问题
-(void)setEngine:(Engine *)newEngine{
if (_engine != newEngine) {
[_engine release]; //释放旧对象 --> 计数减1
_engine = [newEngine retain]; //retain新对象
}
}