ios - Nil __block 变量设置 NSString

标签 ios objective-c warnings block

为了避免保留循环和警告“在此 block 中强烈捕获自身可能会导致保留循环”,我为 block 中的每个对象添加了这样的内容

MyViewController *__weak weakSelf= self;
NSMutableArray *__weak weakArray=AnArray;
UILabel *__weak weakLabel=ALabel;

///the block code with some examples
 up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

       [weakSelf aMethodInTheController];
       [weakLabel setHidden:NO];
       [weakArray addObject:@"something"];

 };

使用弱引用时,保留循环警告会消失,但是如果我在 block 内引入必须设置的 nnstring,则会出现问题

MyViewController *__weak weakSelf= self;
NSMutableArray *__weak weakArray=AnArray;
UILabel *__weak weakLabel=ALabel;

NSString *__weak weakString=AString;

///the block code with some examples
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

   [weakSelf aMethodInTheController];
   [weakLabel setHidden:NO];
   [weakArray addObject:@"something"];
   weakString=@"atext";

 };

通过这种方式,我收到错误“变量不可分配(缺少_ block 类型说明符)”,因此我添加了“_block”

MyViewController *__weak weakSelf= self;
NSMutableArray *__weak weakArray=AnArray;
UILabel *__weak weakLabel=ALabel;

NSString *__weak weakString=AString;
__block NSString *BlockString =  weakString;    

///the block code with some examples
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

[weakSelf aMethodInTheController];
[weakLabel setHidden:NO];
[weakArray addObject:@"something"];
 BlockString=@"atext";

 };

通过这种方式,一切似乎都正常工作,至少直到我在 block 内...我原来的 Astring 变量是在我的 viewController 的 .h 中定义的,我必须稍后在 block 外访问它的值,但它的值始终为零。将 @"atext"分配给 BlockString 不要为我的原始 Astring 变量设置值?我如何设置在我的 viewController 的 .h 中设置的变量的值而不收到警告并且不退出 block ?

最佳答案

Assign @"atext" to BlockString do not set a value to my original Astring variable?

不,它没有设置 Astring ,并且它不应该设置它:当你这样做时

NSString *__weak weakString=AString;

您创建了对 __weak 引用的对象的第二个引用(恰好是 AString )变量(例如 @"some-text" ):

Before

当您设置weakString时 block 内 @"atext" ,您将引用重新指向不同的对象,但 @"some-text"对象仍然被 AString 引用变量:

After

如果你想改变AString变量,将其设置在 block 内。如果是ivar,则使用weakSelf->AString 。如果是本地则添加 __block其声明。

关于ios - Nil __block 变量设置 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19054173/

相关文章:

iOS 核心数据 executeFetchRequest 返回空对象

ios - 带角度的 CAGradientLayer

ios - 多行文本的选定 UITextRange 调整的 CGRect?

c++ - 如果..否则警告 "not all control paths return a value"

objective-c - Objective-C 中的类级别属性(删除警告)

ios - 变量的内容不显示 xcode 调试器

iphone - 如何实现带有行和列的表格

ios - Xcode 段 Controller 错误

ios - 核心数据和 NSUserDefaults-notes 应用程序之间的区别

perl - 为什么Perl的字符串乘法不对undef发出警告?