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 ;