溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存管理高級知識點

發(fā)布時間:2020-07-22 11:38:29 來源:網(wǎng)絡(luò) 閱讀:409 作者:Im劉亞芳 欄目:開發(fā)技術(shù)
  1. 屬性的內(nèi)部實現(xiàn)原理

  2. dealloc內(nèi)釋放實例變量

  3. 便利構(gòu)造器方法的實現(xiàn)原理

  4. collection的內(nèi)存管理

屬性的語義特性及使用范圍。assign  retain  copy

assign下的屬性內(nèi)部實現(xiàn)

setter方法getter方法
@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
       _name = name;
}
- (NSString *)name                                    
{   
     return _name;
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]);    <——————這里因為上面[name release];了,造成野指針異常   

[p release]      

retain下的屬性內(nèi)部實現(xiàn)

setter方法getter方法
@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
       if(_name != name){
            [_name release];
             _name = [name retain];
           }
}
- (NSString *)name                                    
{   
     return [[_name retain] autorelease];
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]);       

NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

[p setName:newName];

[newName release];

NSLog(@“%@“, [p name]);     

[p release]       

copy下的屬性內(nèi)部實現(xiàn)

setter方法getter方法
@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
       if(_name != name){
            [_name release];
             _name = [name copy];
           }
}
- (NSString *)name                                    
{   
     return [[_name retain] autorelease];
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]);       

NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

[p setName:newName];

[newName release];

NSLog(@“%@“, [p name]);     

[p release]      

//疑問?始終有一塊內(nèi)存沒有釋放掉。。。。。。。


dealloc

  • dealloc是NSObject的一個實例方法,與alloc對應(yīng)用與回收開辟的內(nèi)存空間

  • 這個方法在對象引用計數(shù)為0時,由系統(tǒng)自動調(diào)用

  • 通常我們在dealloc中釋放類的實例變量

Person.m中

- (void)dealloc{

       [_name release];  //釋放setter方法泄漏的內(nèi)存,,,完美解決類上面的疑問。。

       [super dealloc];

}


dealloc的注意事項

  • 永遠(yuǎn)不要手動調(diào)用dealloc

  • 在dealloc方法的最后一行,必須要寫[super dealloc];

構(gòu)造便利器的內(nèi)存管理

------->在便利構(gòu)造器的時候只有alloc開辟空間,可是沒有釋放,怎么辦呢 ??


Person.m中

+ (instancetype)personWithName:(NSString *)name{

          Person *p = [[Person alloc] initWithName:name];

          return [p autorelease];

}

或者

+ (instancetype)personWithName:(NSString *)name{

          return [[Person alloc] initWithName:name] autorelease];

}


collection

  • collection就是NSArray, NSDictionary, NSSet,,,,等容器類

  • collection會自主管理自己內(nèi)部元素

加入collection中的對象會被retain

移除出collection的對象會被release 

collection被釋放會對內(nèi)部所有對象release 




向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI