Block的作用:
NSLog(@"参数:%d",a);
return 10;
{
NSLog(@"这是block代码块,a = %d",a);
return 10;
};
[self testBlock:myblock];
-(void) testBlock:(Myblock) myblock
{
//可能有一些逻辑判断
//block回调
myblock(50);
Myblock myblock2 = ^(int a)
{
number = 20;
number++;
NSLog(@"%d",number);
return 10;
};
Myblock *myBlcok = ^(int a)
{
//引用计数为2
NSLog(@"引用计数:%d",obj.retainCount);
return 10;
};
[self objectMethod:^{
//引用了全局变量number
int value = number;
//引用计数2
NSLog(@"计数:%d",self.retainCount);
return a +b;
同 代理-协议、通知一样用于对象和对象之间的通信。
block的定义:
是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象。
block的应用场景:
对象与对象之间的通信。
block的语法:
block的声明:
第一种:
int (^ myBlock)(int);
第二种:
typedef int (^Myblock)
(int);
block的创建:
myBlock = ^(int a){NSLog(@"参数:%d",a);
return 10;
};
block的调用:
int ret = myBlock(20);block作为参数:
Myblock myblock
= ^(int a){
NSLog(@"这是block代码块,a = %d",a);
return 10;
};
[self testBlock:myblock];
-(void) testBlock:(Myblock) myblock
{
//可能有一些逻辑判断
//block回调
myblock(50);
}
block引用局部变量:将局部变量看成是常量:
__block int number
= 10;Myblock myblock2 = ^(int a)
{
number = 20;
number++;
NSLog(@"%d",number);
return 10;
};
block的内存管理:
在block里面引用一个局部的objective-c对象的时候,该对象会被retain
如果局部变量使用_block修饰,则不会被retain。
//引用计数为1
NSObject *obj = [[NSObject alloc] init];Myblock *myBlcok = ^(int a)
{
//引用计数为2
NSLog(@"引用计数:%d",obj.retainCount);
return 10;
};
//引用计数1,block引用该变量时不会将它retain
__block NSObject *obj = [[NSObject alloc] init];
在block里面引用一个实例变量时,该实例对象会被retain
NSLog(@"计数:%d",self.retainCount);[self objectMethod:^{
//引用了全局变量number
int value = number;
//引用计数2
NSLog(@"计数:%d",self.retainCount);
return a +b;
}];
block本身可以就像对象一样copy和release。
block创建后内存是分配在栈上,调用copy方法,会将block从栈移到堆上。
当block声明为全局变量时,我们应该调用block的copy方法。
两种copy方式:
[_block copy];
Block_copy(_block);
两种release方式:
[_block release];
Block_release(_block);
iphoneSDK中哪里用到的block? (UIView动画)
+ (void)animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
;