2014-12-03 57 views
6

我在UITableView的頭文件中發現了這個屬性,並且幾乎每個屬性都是非弧樣式,儘管我的項目正在使用ARC。爲什麼UITableView的委託屬性的屬性很弱

@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 

爲什麼蘋果不使用的,而不是assignweak屬性,它是對非弧形向後兼容?如果是這樣,爲什麼不使用__has_feature(objc_arc)來區分ARC和非ARC。

#if __has_feature(objc_arc) 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 

我希望delegate較弱,所以我不需要當委託實例被釋放委託設置爲零。

感謝您的幫助。

編輯:

我注意到,__has_feature(objc_arc)是錯誤的,因爲我可以使用ARC時,我的部署目標爲4.3,但後來我不能使用weak。所以條件應該是我的部署目標是否等於5.0或更高。

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 
+0

請參閱我的解釋:http://stackoverflow.com/a/24469143/341994它不是「向後兼容非ARC」;它不是ARC。 – matt 2014-12-04 01:20:39

+0

@matt非常感謝。你認爲蘋果公司使用'#if__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_5_0'來提供更好的支持ARC的Cocoa會更好嗎?或者很難做到這一點。 – KudoCC 2014-12-04 01:32:55

+1

可可的這些部分都很陳舊。他們不會很快改變。他們在ARC之前多年。他們是他們。繼續。 – matt 2014-12-04 01:58:35

回答

4

爲什麼蘋果不使用weak property而不是賦值,它對於非弧的後向兼容性?

我已經做了一些research and found,__weak與「assign」修飾符是同義的。但唯一不同的是在分配時委託實例不會被設置爲零。您通常使用IBOutlets和委託的分配修飾符。在ARC下,這被替換爲__weak。但是,有一個警告。 __weak要求您在支持零引用弱引用的運行時上部署應用程序。這包括> =(iOS 5和Lion)。 Snow Leopard或iOS 4及更早版本的操作系統不支持將弱引用歸零。這顯然意味着如果您打算部署到較早的操作系統,則不能使用__weak所有權修飾符。所以是的,在這種敏感的情況下,它對於無弧是向後兼容的。

+0

您說__weak與assign修飾符是同義詞,但是當我使用assign時,在委託實例被釋放之後,代理將不會像__weak修飾符那樣設置爲nil。 – KudoCC 2014-12-03 09:14:39

+0

是的,先生,這是真的。已更新,您是否按照鏈接和說明進行操作。你會理清原因。 – 2014-12-03 09:24:06

+0

謝謝,我會在稍後看到鏈接:) – KudoCC 2014-12-03 09:25:55

0

注意,當你有一個委託,它的分配,這使得該委託值始終設置爲每當對象將被釋放零很重要 - 這樣的對象應該非常小心以零出代表在dealloc中引用它是否在其他地方沒有這樣做。

因此,如果您嘗試使用該對象,則會在釋放對象(指向內存不再分配給期望的對象類型)後導致任何引用left set,將無效。調試器中的一個標誌是調試器聲稱某些變量的類型與實際聲明的變量完全錯誤。

這可能是由於這個原因「爲什麼不是的UITableView的委託財產弱 的屬性「

希望這可以幫助你。