如果在块内引用self,为什么这不是保留周期?

iOS*_*com 3 cocoa cocoa-touch objective-c ios objective-c-blocks

@interface myViewController ()
@property (nonatomic, copy)  NSString* (^translateKey)(NSString *);
@property (nonatomic, copy) NSString *aString;
@end
Run Code Online (Sandbox Code Playgroud)

情况1

@implementation
-(void)viewDidLoad {
    _translateKey = ^NSString*(NSString* translationKey){
        return _aString;
    };
}
@end
Run Code Online (Sandbox Code Playgroud)
  • 编译器抱怨#1是保留周期.而我明白了

案例#2

@implementation
-(void)viewDidLoad {
    NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){        
        return _aString;
    };
    _translateKey = translationKeyBlock;
}
Run Code Online (Sandbox Code Playgroud)
  • 编译器不会抱怨案例#2.但这仍然是一个保留周期吗?

CRD*_*CRD 5

案例2仍然是一个循环?是

为什么错过了?编译器的流程分析没有发现这种情况,在这种情况下这有点令人惊讶(优化者肯定会将translationKeyBlock案例2减少到案例1).

你该怎么办?将其作为"增强请求"提交给Apple,或者通过bugreporter.apple.com将其提交给普通的"bug".他们可能会因为他们没有抓住它而回来,或者他们将来可能会支持它.(这不是我见过的第一个流量分析问题.)