[英]Objective-C, ARC: Is it correct to use __weak arguments?
這是一個使用弱參數的小例子:
@interface MYTestObject : NSObject
@end
@implementation MYTestObject {
void(^_block)(void);
}
- (void)dealloc {
NSLog(@"DEALLOC!");
}
- (id)init {
if (self = [super init]) {
[self doSomethingWithObject:self];
}
return self;
}
- (void)doSomethingWithObject:(id __weak /* <- weak argument! */)obj {
_block = ^{
NSLog(@"%p", obj);
};
}
@end
它的工作原理是: -dealloc
被調用! 另外,如果刪除__weak
,則會得到一個保留周期,這是絕對正確的。
不知道這是否只是副作用,並且使用弱參數完全不安全嗎? 還是這是一種特定的行為,而我只是一個不好的Google用戶?
兩個觀察:
我傾向於在doSomethingWithObject
內進行局部__weak
引用,而不是像捕獲self
時避免強引用循環中所示將其作為__weak
參數。
正如您所問的那樣,我認為使用弱參數完全不安全。 但是,如果沒有其他問題,那是更常見的模式,它具有局部__weak
變量,使我覺得更適合作為doSomethingWithObject
的實現細節而不是方法的公共接口的一部分。
我還將使用copy
內存限定符使block
一個屬性。 正如文檔所說
您應該將
copy
指定為屬性屬性,因為需要復制一個塊以跟蹤其在原始范圍之外的捕獲狀態。 使用自動引用計數時,您不必擔心這件事,因為它會自動發生,但是,最好的做法是讓property屬性顯示結果行為。
從而:
@interface MYTestObject : NSObject
@property (nonatomic, copy) void(^block)(void);
@end
@implementation MYTestObject
- (void)dealloc {
NSLog(@"DEALLOC!");
}
- (id)init {
if (self = [super init]) {
[self doSomethingWithObject:self];
}
return self;
}
- (void)doSomethingWithObject:(MYTestObject *)obj {
typeof(obj) __weak weakObj = obj;
self.block = ^{
NSLog(@"%p", weakObj);
};
}
@end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.