Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果在块中引用self,为什么这不是一个保留循环?_Ios_Objective C_Cocoa_Cocoa Touch_Objective C Blocks - Fatal编程技术网

Ios 如果在块中引用self,为什么这不是一个保留循环?

Ios 如果在块中引用self,为什么这不是一个保留循环?,ios,objective-c,cocoa,cocoa-touch,objective-c-blocks,Ios,Objective C,Cocoa,Cocoa Touch,Objective C Blocks,案例1 @interface myViewController () @property (nonatomic, copy) NSString* (^translateKey)(NSString *); @property (nonatomic, copy) NSString *aString; @end 编译器抱怨说#1是保留循环。我明白这一点 案例2 @implementation -(void)viewDidLoad { _translateKey = ^NSString*

案例1

@interface myViewController ()
@property (nonatomic, copy)  NSString* (^translateKey)(NSString *);
@property (nonatomic, copy) NSString *aString;
@end
  • 编译器抱怨说#1是保留循环。我明白这一点
案例2

@implementation
-(void)viewDidLoad {
    _translateKey = ^NSString*(NSString* translationKey){
        return _aString;
    };
}
@end
  • 编译器不会抱怨案例2。但这仍然是一个保留周期,对吗

    • 我想你的问题是:

      @implementation
      -(void)viewDidLoad {
          NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){        
              return _aString;
          };
          _translateKey = translationKeyBlock;
      }
      
      这仍然是一个保留周期,但编译器不会抱怨什么

      若直接将block设置为_translateKey,编译器将发现此行将进行一个retain循环,并抛出一个错误或警告。 然而,编译器将不确定是否首先将块设置为局部变量。这就是为什么第一行不抱怨错误的原因

      局部变量translationKeyBlock的值可以在执行之前随时更改 \u translateKey=translateKeyBlock

      可能原因是编译器在编写代码时无法检查translationKeyBlock的值。(我不确定100%)


      我希望这能对您有所帮助。

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

      为什么错过了?编译器的流分析没有捕捉到这种情况,这在这种情况下有点令人惊讶(优化器肯定可以省略
      translationKeyBlock
      将情况2减少到情况1)


      你该怎么办?将其作为“增强请求”提交给苹果,或者通过bugreporter.Apple.com提交给普通的“bug”。他们可能会带着一个很好的理由回来,他们没有抓住它,或者他们将来可能会支持它。(这不是我见过的第一个流分析问题。)

      \u translateKey=translationKeyBlock
      意味着在
      viewDidLoad
      中?什么是
      \u currentTag
      ?这是
      myViewController
      的两个
      @实现吗?我已经修复了代码中的两个错误
      
      @implementation
      -(void)viewDidLoad {
          NSString * (^translationKeyBlock)(NSString *) = ^NSString*(NSString* translationKey){        
              return _aString;
          };
          _translateKey = translationKeyBlock;
      }