回答
unsafe_unretained
只存在於ARC中。它在MRC中像assign
一樣工作。這些屬性不會被保留。通常情況下,您不會爲代表使用這些屬性,因爲他們不需要擁有這些屬性的所有者。
weak
屬性就像unsafe_unretained
只是他們工作有點聰明。當分配給該屬性的對象被釋放時,弱引用自動變爲nil
,以避免向該對象(其內存地址)發送消息時發生崩潰。 Unsafe_unretained屬性不這樣做。無論與該地址關聯的對象如何,它們將始終保持分配給它的內存地址(除非您手動更改它)。弱引用可以防止在這種情況下崩潰,但結果仍然不會如預期的那樣。如果你的代碼寫得很好,組織起來不應該發生。
那麼,爲什麼你會用unsafe_unretained
而不是weak
?弱引用僅適用於iOS 5和更高版本,因此如果您要構建定位iOS 4的ARC應用程序,則需要使用unsafe_unretained
屬性。再次,發送消息到發佈的屬性不是你想要的任何代碼,所以如果你的代碼組織的很好,那麼你不應該有任何問題。
謝謝@ JonasG。 :-) – liza
此前ARC的,一個可以指定一個委託或其他參考對父母財產assign
防止保留週期。隨着ARC和較新的編譯器的推出,您將改爲使用unsafe_unretained
。
因此,只要您不需要擁有該參考,並且您不需要或不想使用新的參考類型(在解除分配時將參考置零),就可以使用它。
謝謝@Mike韋勒 – liza
這是一個unsafe_unretained的特定用例。說兩個階級互相參照,一個方向很強,另一個方向弱。在第一堂課的dealloc期間,第二堂課對它的弱引用已經是零,妨礙了正確的清理。用unsafe_unretained引用替換弱引用將解決此問題。請參見下面的代碼示例:
@class Foo;
@interface Bar: NSObject
//Replacing weak with unsafe_unretained prevents this property from becoming nil during Foo.dealloc
@property (nonatomic, weak) Foo *foo;
- (id)initWithFoo:(Foo *)foo;
@end
@interface Foo : NSObject
@property (nonatomic, strong) Bar *bar;
- (void)startObserving;
- (void)endObserving;
@end
@implementation Bar
- (id)initWithFoo:(Foo *)foo {
if ((self = [super init])) {
self.foo = foo;
//Start observing
[self.foo startObserving];
}
return self;
}
- (void)dealloc {
//Since foo is a weak property, self.foo may actually be nil at this point! See dealloc of class Foo.
[self.foo endObserving];
}
@end
@implementation Foo
- (id)init {
if ((self = [super init])) {
self.bar = [[Bar alloc] initWithFoo:self];
}
return self;
}
- (void)dealloc {
//This will trigger the deallocation of bar. However, at this point all weak references to self will return nil already!
self.bar = nil;
//endObserving is never called, because Bar.foo reference was already nil.
}
- (void)startObserving {
NSLog(@"Start observing");
}
- (void)endObserving {
NSLog(@"End observing");
}
@end
- 1. 獲取unsafe_unretained屬性錯誤
- 2. 可可靜態庫 - unsafe_unretained屬性
- 3. 轉換爲ARC:保留屬性爲unsafe_unretained?
- 4. 構建錯誤:期望在'unsafe_unretained'之前的屬性屬性
- 5. 什麼是引用屬性?
- 6. 什麼是屬性?
- 7. uitableviewcell的屬性是什麼?
- 8. 什麼是初始化屬性或屬性的Pythonic方法?
- 9. 什麼是強屬性屬性
- 10. 什麼是用戶類的ou屬性
- 11. wicket:scope屬性的作用是什麼?
- 12. C#中屬性的用途是什麼?
- 13. 'datalim'屬性的作用是什麼?
- 14. 什麼是svn屬性的使用
- 15. html name屬性的用途是什麼?
- 16. ncurses A_PROTECT屬性的作用是什麼?
- 17. 什麼是`constructor`屬性真的用於?
- 18. 爲什麼我應該更喜歡unsafe_unretained限定符而不是分配弱引用屬性?
- 19. S屬性和L屬性語法是什麼意思?
- 20. 用戶控件中的AccessibleRole屬性的用法是什麼?
- 21. 什麼是HttpDelete屬性
- 22. PHPUnit:'屬性'是指什麼?
- 23. 什麼是antiJARLocking屬性?
- 24. 什麼是ThemeInfo屬性?
- 25. 什麼是屬性節點
- 26. 什麼是「空」@about屬性?
- 27. 什麼是g_editable屬性?
- 28. 什麼是.NET Control.Margin屬性?
- 29. 什麼是lpformnum屬性?
- 30. 什麼是UITableView separatorEffect屬性?
您可以檢查 http://stackoverflow.com/questions/8592289/arc-the-meaning-of-unsafe-unretained –