0

关于 Objective-c 块,我正在阅读的文档说:

您不能self在独立块对象中引用。如果需要,您必须将self对象作为参数传递给块。

您无法使用点符号访问独立块内对象的属性。如果您需要这样做,请使用 setter 和 getter 方法。

但我可以编写以下内容,并且它按预期运行。

- (void)testing
{
    self.name = @"wahaha";
    void (^independentBlock)(NSString *arg) = ^(NSString *arg){
        self.name = @"";
        NSLog(@"%@ -- %@",arg, self.name);
    };

    a(@"abcd"); // abcd -- wahaha
}

那么,为什么规则说不能使用点符号呢?

4

1 回答 1

0

该引用似乎是不正确的,尽管他们可能试图跨越这一点,即您不应该在独立块中使用 self 。在您给出的示例中它可以,但是当块被保留并在其他地方使用时会出现问题。

如果 self 在块内被引用,它会保持对它的强引用,并且如果块在“self”内有引用(无论 self 可能是什么),那么您将有一个保留周期和由于 arc 无法而导致的内存泄漏清理它们,因为它们仍然对彼此有很强的引用。

你可以通过声明一个指向 self 的变量来解决这个问题

__weak <#TypeOfSelf#> weakSelf = self; //use weakSelf in your block
于 2014-08-12T06:28:42.150 回答