【问题标题】:Objective-C macro with weak self具有弱自身的 Objective-C 宏
【发布时间】:2014-07-10 21:52:24
【问题描述】:

我有一个宏可以执行很棒的日志。但是,它不能在 self 拥有的块内使用,因为它会形成一个保留循环。

很棒的日志:

#define AWESOME_LOG(__FORMAT__, ...) ALog((@"%p %s:%d " __FORMAT__), self, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

不那么棒的保留周期:

- (void)someMethod:(BOOL)awesome
{
    self.dumbBlock = ^{
        AWESOME_LOG(@"Is this awesome? %@", awesome ? @"Yes" : @"No");
    };
}

是否有任何预处理器巫毒可以确保 self 在这里被弱引用?

【问题讨论】:

  • 我认为不可能。你总是需要 __weak id weakself = self; 在块之前的某个地方。
  • 相关:NSAssert 里面包含self,在块中使用也有同样的问题。

标签: objective-c macros c-preprocessor objective-c-blocks self


【解决方案1】:

尝试使用@weakify/@strongify。它创建了一个新的弱/强引用来遮蔽self

http://blog.aceontech.com/post/111694918560/weakifyself-a-more-elegant-solution-to

- (void)someMethod:(BOOL)awesome {
    @weakify(self);
    self.dumbBlock = ^{
        @strongify(self);
        AWESOME_LOG(@"Is this awesome? %@", awesome ? @"Yes" : @"No");
    };
}

【讨论】:

  • @strongify 是必需的。否则你只创建了self_weak_ 变量。
  • @strongify 是这样
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多