簡體   English   中英

Objective-C,ARC:使用__weak參數正確嗎?

[英]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用戶?

兩個觀察:

  1. 我傾向於在doSomethingWithObject內進行局部__weak引用,而不是像捕獲self時避免強引用循環中所示將其作為__weak參數。

    正如您所問的那樣,我認為使用弱參數完全不安全。 但是,如果沒有其他問題,那是更常見的模式,它具有局部__weak變量,使我覺得更適合作為doSomethingWithObject的實現細節而不是方法的公共接口的一部分。

  2. 我還將使用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.

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