2011-08-29 35 views
0

我剛剛開始瞭解如何在iOS中正確釋放內存管理對象。我最大的問題是基於下面的代碼。爲什麼這是一個對象的合法發佈? (iOS內存管理)

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"My View Controller"; 

    UIBarButtonItem *item = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
          target:self 
          action:@selector(doSomething)]; 
    self.navigationItem.rightBarButtonItem = item; 

    [item release]; 
} 

好的,我看到UIBarButtonItem已經創建(alloc)。現在,它被設置爲rightBarButtonItem財產下面一行:

self.navigationItem.rightBarButtonItem = item; 

直接將此行後,該項目得到釋放。

[item release]; 

我認爲該項目被複制到rightBarButtonItem,但我怎麼能知道發生這種情況。如果它通過引用傳遞,我會有一個問題不是嗎?有人可以澄清這裏發生了什麼,爲什麼釋放物體是合法的?非常感謝。

+0

在那裏你開始不啓動。從[自動引用計數]開始(http://clang.llvm.org/docs/AutomaticReferenceCounting.html)。我建議您查看ARC上的Apple文檔,如果您有權訪問它,儘管該鏈接會提供所有詳細信息。 –

+0

怎麼回事?我實際上認爲顯式的內存管理對我的學習非常有用。 – Ryan

+0

因爲Objective-C對象的顯式內存管理已經過時。你花時間研究轉移到ARC的問題。 ARC帶來了不同的問題,而這些就是你應該問的問題。 –

回答

5

這是因爲rightBarButtonItem被宣佈retained。 (見UINavigationItem Documentation

當你聲明屬性爲保留:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem 

你是說,當你會改變它的價值aNavItem.rightBarButtonItem = aNewItem你將發送[aNewItem retain]消息。

因此,你可以安全地釋放它之後

(因爲它是由rightBarButtonItem保留)有關詳細信息,我強烈建議你看看(每月只需習慣它,直到它成爲第二本性)在所述Apple Memory Management Documentation

2

當它被分配給rightBarButtonItem,它被保留。重要的是要記住,版本不會「擺脫對象」 - 它只是減少保留計數。只有當保留計數達到0時,對象纔會被釋放。

在這種情況下,當您將項目分配給rightBarButtonItem時,其保留計數遞增到2.接下來,當您釋放它時,保留計數將遞減爲1.當導航控制器消失時,這將轉到0(然後你的項目將被釋放)。

這個工作,只要它是類型的屬性保留:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem 

你可以看一下API的報頭,以確定您要分配到什麼類型的財產。

0

這裏的關鍵,瑞安,就是rightBarButtonItem被保留存儲在它的對象。

上面的答案是相當不錯的。我要添加的一件事是,您還可以查看描述該屬性的文檔,它說@property(nonatomic,retain)。所以,如果你不喜歡閱讀頭文件,它也在文檔中。