簡體   English   中英

在Objective-C中將“分配器”與設置器嵌套

[英]nesting “alloc” with a setter in Objective-C

這里的第一個問題是關於iPhoneOS3而不是MacOSX。 我對Objective-C相當陌生,而且我從來沒有在沒有自動垃圾收集的環境中進行開發,因此對此感到有些困惑。 這是一些有效的代碼,它們從Apple.com的示例向應用程序委托分配視圖控制器:

MyViewController *aViewController = [[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];

因此,據我了解,我必須釋放aViewController,因為它首先被分配了(+1 = 1); 然后保留在二傳手(+1 = 2); 然后釋放在二傳手(-1 = 1); 然后不再需要,因此最終再次釋放(-1 = 0)並釋放了內存。 我不僅可以跳過分配臨時對象aViewController並嵌套這些功能的方法,就像這樣:

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

我想知道這是否可以正常工作? 我有點擔心,因為安裝程序需要一個指向ViewController的指針,而不是一個副本。 而且由於我只傳遞了一個返回值,因此在setter中的指向ViewController的指針是否將指向可能被擦除或丟失的數據,然后才能分配它? 很抱歉,這似乎是一個愚蠢的問題,但是我很難在任何地方找到答案,而且我正在嘗試為非垃圾收集環境建立好的技術。 謝謝!

不要以絕對保留數來考慮內存管理。 完全從所有權和封裝角度考慮它。

alloc對象時,您已經創建了一個擁有的對象。 當您將該對象設置為另一個對象的值時,該另一個對象保留該對象以表示所有權。 如果您的代碼不再對對象感興趣,則應release (或將其返回給其他對象,然后autorelease )。

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

為了回答您的特定問題, 假設正確地實現了-setMyViewController:以上代碼本身將導致內存泄漏。

我認為這段代碼可以正常工作,並且不會引起內存泄漏:

MyViewController *aViewController = [[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
[setMyViewController:aViewController];

感謝所有的幫助!

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

在這里您進行分配,然后將其保留,因此保留的計數立即為2。但是,由於您仍將setter的指針傳遞給視圖控制器,因此它將正確設置。

如果MyViewController屬性的類型為Assign(不保留),則保留計數僅為1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM