1.对于block的访问范围,对于block内部的变量,可以随意访问,但是对于block之外的外部变量,就需要加上关键词__block
比如:
-(void)A
{
//int outsideVar = 10;//error
__block int outsideVar = 10;
void(^B)()=^(void)
{
int insideVar = 20;
NSLog(@"inside var = %d",insideVar);
outsideVar = 30; //error
};
B();
}
如果不使用限定词的话,block里面只是一个只读复制,就像
比如:
- (void)scopeTest
{
NSUInteger integerValue = 10;
BlockWithNoParams myBlock = ^{
NSLog(@"Integer value insdie the block = %lu",(unsigned long)integerValue);
};
integerValue = 20;
myBlock();
NSLog(@"Integer value outside the block = %lu",(unsigned long)integerValue);
}
输出结果:1020
2.对于单独的block对象,不能访问self对象,
例如:
void(^inCorrectBlockObject)(void)=^{
NSLog(@"self==%@",self);//error, self is undefine here
}
如果需要访问,可以放在obj-c方法中,
比如:
- (void)simpleMethod
{
void(^A)(void)=^(void)
{
NSLog(@"self==%@",self);//correct;
};
A();
}
3.对于类变量的访问,
比如:(一种是单独的block)
@property(nonatomic, retain) NSString*aString;
@synthsize aString;
void(^A)(void) = ^(void){
//self.aString = @"b sring";//error,不能用self.这样的形式,但是可以用set,get方法
[self setAString:@"bString"];
};
比如:(一种是在objectc方法中)
@property(nonatomic, retain) NSString*aString;
@synthsize aString;
- (void)A
{
void(^A)(void)=^{
self.aString = @"B string";
NSLog(@"aString=%@",aString);
};
A();
}