2012-10-22 91 views
4

我有關釋放IBOutlet對象的內存的困境。任何人都請建議當我們創建沒有屬性的IBOutlet對象時需要做什麼,需要釋放它?如果需要釋放...爲什麼我們要釋放它需要發佈IBOutlet對象嗎?

回答

4

答案是肯定的。

運行時使用[setValue:ForKey:]將對象連接到IBOutlet。該函數將查找私有實例變量,保留目標並將其設置爲實例變量。請訪問iOS Developer Library以瞭解更多信息。

我強烈建議你閱讀文章,因爲許多iOS框架通過鍵值符合性([setValue:ForKey:][valueForKey:])訪問屬性,而不是直接調用getters/setters /實例變量。

1

IBOutlet不會更改屬性的所有權語義。如果您不使用ARC,則必須像保留其他任何屬性一樣釋放保留的對象。

+0

我的問題是,..如果不打算給做財產爲目的......仍然需要釋放的dealloc塊IBOutlet中釋放對象? – SachinVsSachin

1

只需將其設置爲默認值,即「弱」。那麼你對ARC很好。

1

爲什麼不只是有一個私人IBOutlet屬性,使事情更清晰和更明確。我一直這樣做:

MyClassName.m 

@interface MyClassName() 
@property (nonatomic, weak) IBOutlet NSObject *myPropertyNameForAnOutlet; 
@end 

@implementation MyClassName 
... 
@end 
+0

邁克爾你是對的..但仍然有這個困惑。我的問題是,如果m不會給該對象的屬性...仍然需要釋放IBOutlet對象釋放dealloc塊? – SachinVsSachin

+0

對不起,你說得對,這還不夠。但是,如果你使它變弱,並且你正在使用ARC,那麼你可以放心,它會被正確地清理,而不需要你額外的努力。只需將您的用戶界面添加到它並忘記它。如果是非ARC,那麼在viewDidUnload(iOS 6之前)中將其設置爲零,然後在dealloc中釋放它。如果我是你,我會去ARC並節省工作。 – Michael

+0

+1我不知道用'IBOutlet'標記私有屬性(在類擴展中)的可能性。謝謝! –

-1

即使您沒有將它設置爲屬性,該屬性是指setter和getter方法。當你使用一個對象時,你應該永遠記得釋放它。該屬性與內存問題無關。

1

答案是肯定的......

我感到困惑的是太多,但試試這個:

打開廈門國際銀行文件

onen助理編輯窗口,並讓附近的.h文件中的代碼XIB IB文件

在IB文件(沒有提及任何VAR對象)

CTRL點擊選擇上一個對象,並選擇:「新的參考出口「按鈕

阻力線在@interface {}部分

您.H代碼文件提供一個名稱你的新變種(‘AAA’)

(注意,沒有財產」 AAA 「創建)

現在的Xcode已經爲你做所有的魔法,...

在.m文件就可以發現,在dealloc方法

- (void) dealloc { 
    [aaa release]; 
    [super dealloc]; 
} 

so ...如果蘋果釋放它,似乎通過XIB文件加載的默認IBOutlet vars被保留...

編輯:

這裏的point in apple doc

+0

謝謝meronix ..當我用同樣的方法,你使用.. – SachinVsSachin

+0

蘋果文檔說,如果你採取所有權(分配,保留,複製),那麼你可以釋放它..爲什麼這個對象釋放蘋果dealloc方法 – SachinVsSachin

+0

他們也表示你可以對在nib中加載的對象進行響應:「然後你應該綜合相應的訪問器方法,或者根據聲明來實現它們,並且(在iOS中)在dealloc中釋放相應的變量。」 //:在https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW8 – meronix

1

您不是該對象的所有者。因此不需要發佈IBOutlet對象。如果您在IBoutlet對象上使用@property(nonatomic,retain),則必須在dealloc中釋放該對象。

看看Advanced Memory Management Programming Guide
你一定不會放棄對象的所有權不屬於您

0

你是不是對象的所有者,所以你不鬆開。

您成爲通過保持,複製或創建(INIT/ALLOC)的對象的所有者。只有這樣你纔是對象的所有者(你)之一,並且在你完成對象時需要釋放它。更多信息檢查 Cocoa core competencies - Memory Management

我希望這可以解釋爲什麼你不必釋放對象。

+0

HTTPS閱讀developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW8這裏大公說你需要releas它(在iOS版) – meronix

+0

是的,它還說「在ARC之前,用於管理nib對象的規則與上面描述的不同,您如何管理對象取決於平臺和使用的內存模型。無論您開發哪種平臺,都應該使用Objective-C聲明的屬性功能來定義網點「,因此爲了確保您正確地使用它,您應該將其用作屬性。 – ophychius

+0

是的,我同意並始終更喜歡使用財產,但「學術」問題是:如果我們不使用屬性(聲明保留或分配),這是Xcode默認使用的屬性?我想,如果它被分配,我們試圖釋放它,我們得到一個殭屍崩潰......但這不會發生......所以默認行爲應該是「保留」......說當然它更好(更快,更容易)使用屬性和deallc self.myProperty =零; – meronix