iOS中autorelease變數應注意的問題

來源:互聯網
上載者:User

在iOS開發當中,如果是從C/C++轉過來的開發人員一定得注意,obj-c中的autorelease變數範圍問題。
 
如有www.2cto.com下面一個類;
 
 
 
@interface ViewController : UIViewController 

    NSDate *memberDate; 
    NSDate *properDate; 

 
@property(nonatomic, retain) NSDate* properDate; 
 
@end 
@interface ViewController : UIViewController
{
    NSDate *memberDate;
    NSDate *properDate;
}
 
@property(nonatomic, retain) NSDate* properDate;
 
@end
 
然後在類實現中對其成員變數初始化:
 
 
 
- (void)viewDidLoad 

    [super viewDidLoad]; 
    memberDate      = [NSDate date]; 
    self.properDate = [NSDate date]; 

- (void)viewDidLoad
{
    [super viewDidLoad];
    memberDate      = [NSDate date];
    self.properDate = [NSDate date];
}
然後在類的成員方法中用使用這兩個成員變數,如[memberDate description]。這時候memberDate的值是無效的,而properDate的值是有效。為什麼會這樣呢?
 
因為memberDate = [NSDate date];這句執行後,memberDate指向的是一個autorelease的變數,這些autorelease的變數在runloop下一次輪詢的時候會被release。所以memberDate就是c/c++中的野指標,野指標會讓程式crash掉。而property是用retain聲明的屬性,所以成員變數properDate指向的地址retrain count是1,不會被auto release,所以是有效記憶體空間,當然就不會crash了。
 
 
得出的教訓:autorelease變數最好在其範圍內使用,除非你手動retrain,如上面代碼可改變memberDate = [[NSDate date] retrain];這樣memberDate指向的地址就與類的生命週期一樣,retrain count為1,不會被autorelease。但是在dealloc方法裡一定要手動[memberDate release]不然就有記憶體溢出。
 
摘自 開心程式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.