[英]Confusion about ARC , AutoRelease
我是IOS開發的新手,我已經開始學習目標c來編寫IOS 7.並且據我所知,由於自動引用計數,現在編碼比現在更容易。 還有一些我不明白的事情。 在MAIN方法中我們有autoreleasepool塊,所以我的第一個問題是,為了啟用ARC,代碼必須在這個塊內? 如果不是,那么autoreleasepool中的代碼和其他代碼之間的區別是什么?
我的第二個問題是,當我編寫我的IPHONE程序時,我有很多類,而這些代碼中沒有這些代碼在“autoreleasepool”中,只有MAIN方法中的代碼。
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([HomepwnerAppDelegate class]));
}
}
那么,這是否意味着這個塊以某種方式神奇地應用於同一程序的任何其他類中的所有代碼行?
我的最后一個問題是無論是使用ARC還是沒有它,如果我們在方法中有一個聲明的指針變量,當方法返回/退出時,對象是否被釋放/銷毀?
假設我們有這樣的方法:
- (void)doSomething {
NSMutableArray *allItems = [[NSMutableArray alloc] init];
NSString *myString = @"sample string";
[allItems addObject:myString]
}
那么當我們調用這個方法並退出時,方法中定義的那些局部變量會發生什么? 如果我們使用ARC,結果是否有任何差異? (對象仍在內存中或不在內存中)
自動釋放池在ARC之前大約15年。 Cocoa使用引用計數內存管理方案,其中(概念上,至少)對象是使用引用計數1創建的, retain
將其增加1並且release
將計數減少1,並且當計數到達時對象被銷毀0。
這個方案的一個問題是它使得返回一個對象有點笨拙,因為你不能在返回它之前釋放它 - 如果你這樣做了,它可能會在另一個方法使用之前被銷毀 - 但是你不要我想要另一種方法來釋放對象。 這是自動釋放池的用武之地。自動釋放池允許您將對象傳遞給它,並且它承諾稍后為您釋放對象。 在手動保留/釋放(我們以前在ARC之前做事的方式)下,您通過向對象發送autorelease
來完成此操作。
好的,那么ARC就出現了。 唯一真正改變ARC的是你不再是寫retain
, release
和autorelease
- 編譯器會為你插入它們。 但是你還需要一個自動釋放池來自動釋放對象。
至於你的第二個問題:
我的最后一個問題是無論是使用ARC還是沒有它,如果我們在方法中有一個聲明的指針變量,當方法返回/退出時,對象是否被釋放/銷毀?
假設我們有這樣的方法:
- (void)doSomething { NSMutableArray *allItems = [[NSMutableArray alloc] init]; NSString *myString = @"sample string"; [allItems addObject:myString] }
那么當我們調用這個方法並退出時,方法中定義的那些局部變量會發生什么? 如果我們使用ARC,結果是否有任何差異?
如果您正在使用ARC,編譯器將釋放由局部變量引用的任何對象。 如果您不使用ARC,則需要自己編寫[allItems release]
,因為超出范圍的變量不會神奇地導致它引用的對象被釋放。
IOS開發的新手
最好不要擔心,自動意味着你大多專注於其他事情^)
這是否意味着這個塊以某種方式神奇地應用於同一程序的任何其他類中的所有代碼行
是。 您處於main
函數中,因此執行的所有代碼都必須在此函數中 - 您的應用程序將在它結束時終止。 除非你創建一個單獨的線程,但是很難這樣做。
代碼必須在這個塊內
如上所述, 主線程上的所有代碼都將在此塊中執行。
在方法中定義的那些局部變量會發生什么
你保證在返回之前會被摧毀。
在MAIN方法中我們有autoreleasepool塊,所以我的第一個問題是,為了啟用ARC,代碼必須在這個塊內? 如果不是,那么autoreleasepool中的代碼和其他代碼之間的區別是什么?
通過相應的Objective-C編譯器設置啟用ARC。 如果您在最新版本的Xcode中創建一個新項目,它將默認啟用。
@autorelease關鍵字將大括號內的代碼放入自動釋放池范圍。 自動釋放池既可用於ARC,也可用於手動內存管理。
我的第二個問題是,當我編寫我的IPHONE程序時,我有很多類,而這些代碼中沒有這些代碼在“autoreleasepool”中,只有MAIN方法中的代碼。
iOS應用程序是基於事件的。 當您調用UIApplicationMain函數處理觸摸事件,通知等時,主線程啟動事件循環。此事件循環具有自己的自動釋放池,在循環迭代結束時自動釋放對象。 此自動釋放池與您在main函數中看到的自動釋放池無關。
我的最后一個問題是無論是使用ARC還是沒有它,如果我們在方法中有一個聲明的指針變量,當方法返回/退出時,對象是否被釋放/銷毀?
如果使用ARC,則將釋放對象(除非從方法返回對對象的引用)。 在MMR中,您需要手動發送release
消息以銷毀對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.