1

我已閱讀關於ARC的概念以及我們如何使用@property來定義strongweak引用。我的問題是如何做一個定義或者當他們都在裏面方法的空閒指針和我想的範圍結束這樣的存儲器,可儘快回收,因爲這ARC內部方法創建指針

- (void) SomeMethod { 
    NSString* databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; 
    .... 
    .... 
    } 

我的問題是我怎麼釋放字符串databasePath

+0

看看這裏:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH TL;您不必爲此煩心,ARC會爲您解除分配數據庫路徑。 –

回答

1

除非一些實例變量的....碼商店databasePath,爲字符串的內存將盡快爲您分配nildatabasePath,或者讓變量超出範圍回收。你不需要爲它做任何特別的事情,因爲你使用了alloc/init

故事是自動釋放的對象略有不同,即

NSString* databasePath = [NSString stringWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; 

此字符串將呆在身邊,直到運行循環到達遞減引用計數,除非你單獨的自動釋放池裏面創建它。因此,只需將databasePath設置爲nil就不足以立即釋放內存:您需要在自己的變量周圍放置一個自動釋放池,以便立即釋放內存。

+0

讓我看看我是否得到這個正確的如果沒有強指針指向它。如果由init和alloc分配,指針指向的內存會自動回收?自定義對象怎麼樣? alloc和init有什麼特別之處。感謝 –

+0

@JamesFranco'alloc/init'沒有什麼特別之處,autorelease有一些特殊的東西,當一個對象被創建時引用計數爲1而不是零。發生這種情況時,自動釋放池會進入畫面,因此該對象不會立即釋放。這也不是全部故事,因爲編譯器有時會嘗試優化autorelease池的行程,即使對於自動釋放對象,但它對於實際正在進行的操作來說是一個體面的工作近似。 – dasblinkenlight

2

當你聲明一個局部變量時,它默認標記爲強引用。當所有對var的強引用都丟失時,內存將被釋放。因此,在外部範圍內,您的變量內存會自動釋放,因爲強大的引用在範圍內。