代码块(block)的使用---iOS4.0以后推出(声明成属性的时候,用copy修饰)
2014-03-19 13:01
387 查看
@脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:
@代码如下:
plaincopy
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
运行结果是:print:hello world!
plaincopy
NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2)
{
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@", sortArray);
运行结果:sortArray:(
"abc 05",
"abc 1",
"abc 12",
"abc 13",
"abc 21"
)
[cpp] view
plaincopy
static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@"num:%d", i);
blocks(i - 1);
}
};
blocks(3);
运行打印结果:
num:3
num:2
num:1
[cpp] view
plaincopy
int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@"global:%d", global);
};
block();
NSLog(@"global:%d", global);
}
return 0;
}
运行打印结果:
global:1001
global:1001
而局部变量可以使用,但是不能改变。
[cpp] view
plaincopy
int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block
[cpp] view
plaincopy
__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
@代码如下:
// block类似于C的函数指针 结合typedef使用 // 返回值类型 (^block变量名)(参数列表) typedef NSComparisonResult(^MyBlock)(int,int); typedef NSComparisonResult(^BlockNSSting)(NSString *,NSString *); typedef NSComparisonResult(^DoubleCompareBlock)(double,double); #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //------------------------------------------------------------------------ BlockNSSting stringBlock = ^(NSString * obj1,NSString * obj2){ return [obj1 compare:obj2]; }; // 使用block NSLog(@"%ld",stringBlock(@"A",@"a")); //------------------------------------------------------------------------ MyBlock myBlock = ^(int a,int b){ if (a > b) { return NSOrderedDescending; } else if(a < b){ return NSOrderedAscending; } return NSOrderedSame; }; // 使用block NSLog(@"%ld",myBlock(10,20)); //------------------------------------------------------------------------ DoubleCompareBlock doubleBlock = ^(double a,double b){ return NSOrderedSame; }; // 使用block NSLog(@"%ld",doubleBlock(10.0,10.0)); } return 0; }
1、参数是NSString*的代码块
[cpp] viewplaincopy
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
运行结果是:print:hello world!
2、代码用在字符串数组排序
[cpp] viewplaincopy
NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2)
{
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@", sortArray);
运行结果:sortArray:(
"abc 05",
"abc 1",
"abc 12",
"abc 13",
"abc 21"
)
3、代码块的递归调用
代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用[cpp] view
plaincopy
static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@"num:%d", i);
blocks(i - 1);
}
};
blocks(3);
运行打印结果:
num:3
num:2
num:1
4、在代码块中使用局部变量和全局变量
在代码块中可以使用和改变全局变量[cpp] view
plaincopy
int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@"global:%d", global);
};
block();
NSLog(@"global:%d", global);
}
return 0;
}
运行打印结果:
global:1001
global:1001
而局部变量可以使用,但是不能改变。
[cpp] view
plaincopy
int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block
[cpp] view
plaincopy
__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
相关文章推荐
- iOS 面试题(九):为什么block要使用copy而不是strong或者其他属性修饰?
- iOS为什么Block的属性声明要用copy
- ios-block作为属性的时候为什么用copy
- iOS为什么Block的属性声明要用copy
- iOS为什么Block的属性声明要用copy
- iOS内存管理(4)--Block属性用copy修饰 & 避免循环引用的问题
- iOS 属性知识之为什么要使用copy特性
- IOS开发 block(代码块)基本使用
- IOS中属性的关键修饰词:strong weak assign copy retain等。。
- ios 基础Block为什么用copy修饰
- IOS中block的声明定义和使用 一
- ios 使用xcode调试代码的时候进入断点显示变量全是nil,但NSLog输出那个变量却是有值的
- iOS开发-------属性用copy、strong修饰的区别
- [iOS]NSString到底使用Copy还是使用Strong属性,有什么区别
- 使用copy与strong声明NSString属性的区别
- iOS: ARC和非ARC下使用Block属性的问题
- iOS之Block为什么用copy修饰
- NSString和block的属性时copy,而不用retain 而容器类使用retain
- 为什么声明NSString属性时,一般使用Copy?
- iOS中代码创建UIView的时候,使用weak还是strong?