黄金法则&retainCount

来源:互联网 发布:linux ide 编辑:程序博客网 时间:2024/04/29 10:58

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 arrayretain];

        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新对象

    }

}

0 0