为了避免保留循环和警告“在此 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"
toBlockString
do not set a value to my originalAstring
variable?
不,它没有设置 Astring
,并且它不应该设置它:当你这样做时
NSString *__weak weakString=AString;
您创建了对 __weak
引用的对象的第二个引用(恰好是 AString
)变量(例如 @"some-text"
):
当您设置weakString
时 block 内 @"atext"
,您将引用重新指向不同的对象,但 @"some-text"
对象仍然被 AString
引用变量:
如果你想改变AString
变量,将其设置在 block 内。如果是ivar,则使用weakSelf->AString
。如果是本地则添加 __block
其声明。
关于ios - Nil __block 变量设置 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19054173/