代码之家  ›  专栏  ›  技术社区  ›  Korey Hinton ZelluX

Objective-C块:如果从指向self的弱指针调用,那么可以在外部方法中修改self吗?

  •  0
  • Korey Hinton ZelluX  · 技术社区  · 10 年前

    您可以从从块内的弱self指针调用的实例方法修改self吗?

    -(void)someMethod:(AnotherClassName *)anObject {
    
        __weak MyClassName *weakSelf = self;
    
        [anObject requestSomethingWithCompletion:^{
            [weakSelf updateSomething];
        }];
    }
    
    -(void)updateSomething {
        self.something = @"update"; // Will this cause a memory leak?
    }
    

    所以基本上我是从我所在的同一类调用实例方法,但我是从弱指针调用,然后更改 self .

    根据 Apple's Programming with Objective-C Guide 这是如何调用 自己 在一个街区内,但天气不好,我可以直接修改 自己 在该方法中。

    如果你知道答案是基于你之前读过的东西,请附上来源。

    谢谢

    1 回复  |  直到 10 年前
        1
  •  4
  •   Avt    10 年前

    您可以修改财产和调用方法。不会有内存泄漏。

    但您的块现在不是线程安全的。如果 requestSomethingWithCompletion 将异步运行块( self )可以在块执行期间解除分配,并且 weakSelf 将变为零。这可能会导致问题(取决于你的区块做什么)。避免这种情况的好做法是按照以下方式写

    -(void)someMethod:(AnotherClassName *)anObject {
    
        __weak MyClassName *weakSelf = self;
    
        [anObject requestSomethingWithCompletion:^{
            MyClassName *strongSelf = weakSelf;
            [strongSelf updateSomething];
        }
    }
    
    -(void)updateSomething {
        self.something = @"update"; // No leaks here!
    }