鉴于以下情况:

- (void) someMethod
{
    dispatch_async(dispatch_get_main_queue(), ^{
        myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
                                                           target: self
                                                         selector: @selector(doSomething)
                                                         userInfo: nil
                                                          repeats: NO];
    });
}

其中myTimer在专用接口中声明:

@interface MyClass()
{
    NSTimer * myTimer;
}
@end

如何修复以下警告:

Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior

根据我迄今为止的发现,大多数建议都包含以下内容:

- (void) someMethod
{
    __typeof__(self) __weak wself = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        wself.myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
                                                           target: self
                                                         selector: @selector(doSomething)
                                                         userInfo: nil
                                                          repeats: NO];
    });
}

除此之外,myTimer是一个ivar,这意味着wself不能访问任何属性.

我想我的问题是:

  1. 我在乎吗?
  2. 我应该将myTimer声明为属性吗?

我在代码中经常使用IVAR.我刚刚在我的项目中添加了-Weverything标志,以查看是否可以找到任何潜在问题,这是迄今为止最常见的警告.通过制作ivars属性,我可以解决这个问题,但我想确保在我这么做之前,我能更好地理解它.

推荐答案

myTimer替换为self->myTimer将修复您的警告.

当您在代码中使用iVar _iVar时,编译器将用self->_iVar替换代码,如果您在块中使用它,块将捕获自身而不是iVar本身.警告只是为了确保开发人员理解这种行为.

Objective-c相关问答推荐

Objective-C NSMutableArray 在枚举时发生了变异?

如何获取 NSDictionary 中的第一个元素?

如何在 Cocoa 中创建字符串的 MD5 哈希?

为什么当我使其处于非活动状态时,弱 IBOutlet NSLayoutConstraint 变为 nil?

iOS 编译错误:CDVCommandDelegateImpl没有可见的@interface 声明 Select 器执行:

如何将 UISlider 垂直放置?

iOS 正确使用 @weakify(self) 和 @strongify(self)

UICollectionView 标头未显示

如何判断特定的 ViewController 视图当前是否可见?

接口类型不能静态分配?

[MFMailComposeViewController canSendMail] 什么时候返回 NO

UICollectionView 单元格 Select 和单元格重用

Core Data使用原始数据类型的标量属性复选框

立即检测 iOS 方向变化

如何将 NSOperationQueue 与 NSURLSession 一起使用?

可变集合有文字语法吗?

ARC时代的财产与ivar

AppDelegate 的当前视图控制器?

状态栏文本 colored颜色 iOS 7

使用正则表达式查找/替换 NSString 中的子字符串