Objective-C 基礎知識之 (十七):內存管理原則二


內存管理


原則:

1、在一段代碼內,對象的引用計數增加和減少要保證平衡。

2、凡是調用了retain、alloc、copy造成引用計數增加,當不再需要使用這個對象時,要調用release或autorelease相應的減少引用計數。

3、便利構造器方法內部要調用autorelease方法避免內存泄露。

4、使用便利構造器方法創建的對象,不需要調用release方法,否則會造成過度釋放。

5、當對象的引用計數減為0時,對象會自動調用dealloc,不能手動調用。

6、在MRC下,實現dealloc方法時,最后一句代碼[super dealloc]。

7、當對象的實例變量引用對象時,如果造成引用計數增加,需要在對象的dealloc方法中相應的減少引用計數。

8、集合對象會自動管理添加的對象。集合對象造成被添加對象的引用計數變化,不歸我們處理。

9、誰造成引用計數增加,誰相應的減少引用計數。

10、對象類型的屬性(除了delegate)都是用retain或copy修飾,如果使用assgin修飾會造成野指針(對象的實例變量是野指針)。

 

相關方法的內存實現:

- (void)setGender:(NSString*)gender

{

    if (_gender != gender) {

       

        [_gender release];

       

        _gender = [gender retain];

    }

}

 

-(void)setAddress:(NSString *)address

{

    if (_address != address) {

       

        [_address release];

       

        _address = [address copy];

    }

}

 

-(instancetype)initWithGender:(NSString *)gender

{

    self = [super init];

    if (self) {

       

        _gender = gender;

    }

    return self;

}

 

+(instancetype)personWithGender:(NSString *)gender

{

    Person * p = [[Person alloc]initWithGender:gender];

   

//    當管理這個對象的自動釋放池銷毀時,這個對象的引用計數減1.

//    自動釋放池可能是系統創建的,可能是我們創建的。

    return [p autorelease];

}

 

- (void)dealloc

{

//    _gender、_address在指向外部傳入的字符串對象時,都造成了對象的引用計數增加

    [_gender release];

    [_address release];

   

    [super dealloc];

}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: