首页 > block里为什么不能操作成员变量?

block里为什么不能操作成员变量?

我想在一个block里对一个成员变量赋值,但是提示“ use of undeclared identifier self"错误,
请问这是怎么回事?

代码如下:

void (^successBlock)(id ) = ^(id responseObject){
    NSLog(@"responseObject:%@",responseObject);
    NSInteger result = [[responseObject objectForKey:@"result"]integerValue];
    if(result == 1){
        self.missionsArr= [[responseObject objectForKey:@"data"]objectForKey:@"list"];
    }else if (result == 0){
        NSLog(@"0");
    }
};

不是block的问题 看你的错误信息 想是在类方法中调用了这部分代码 方便的话把多贴点代码
另外关于block的知识 推荐你看下http://www.devtang.com/blog/2013/07/28/a-look-inside-blocks/

楼上的回答是为了防止retain cycle


同意楼上,你看到的@weakify应该是__weak的宏定义,原因楼上说的很清楚


#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;

等了一天没人回答...首先说一下,我不是很能解释的清楚为什么不能在block里调用self变量。但是我遇到这种情况知道怎么可以调用self的变量。

@weakify(self);

void (^successBlock)(id ) = ^(id responseObject){ NSLog(@"responseObject:%@",responseObject); NSInteger result = [[responseObject objectForKey:@"result"]integerValue]; if(result == 1){ @strongify(self); self.missionsArr= [[responseObject objectForKey:@"data"]objectForKey:@"list"]; }else if (result == 0){ NSLog(@"0"); } }

加一个weakify和strongify这个应该就可以解决问题了,希望楼下的回答能顺便解释以下为什么block不能回调。我大概是明白但是我解释不清楚...
如果还没有解决可以给我留言说一声,因为我这样用基本上就解决了。


同意楼上,block里最好不要直接用self,最好在外面__weak typeOf(& *self)weakSelf = self;
之后在block里用weakSelf就行了。防止循环引用。

【热门文章】
【热门文章】