0

下面是一个使用弱参数的小例子:

@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您将获得一个保留周期,这是绝对正确的。

想知道,如果这只是一个副作用并且使用弱论点是完全不安全的?或者它是一种特定的行为,我只是一个糟糕的谷歌用户?

4

1 回答 1

5

两个观察:

  1. 我倾向于在__weak内进行本地引用doSomethingWithObject,而不是像在捕获时避免强引用循环__weak中所说明的那样将其作为参数。self

    正如您所问的,我认为“使用弱论点是完全不安全的”。但如果没有别的,拥有局部__weak变量是更常见的模式,并且让我觉得它更适合作为方法公共接口的实现细节doSomethingWithObject而不是方法的公共接口的一部分。

  2. 我还会使用内存限定符创建block一个属性。copy正如文档所说

    您应该指定copy为 property 属性,因为需要复制一个块以跟踪其在原始范围之外捕获的状态。这不是您在使用自动引用计数时需要担心的事情,因为它会自动发生,但最好让 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
于 2013-08-19T18:00:39.680 回答