//
// main.m
// 代码块
//
// Created by on 14-10-10.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
int value = 6;
// 定义一个代码块, 注意大括号后面的分号
int (^myBlockFirst)(int number) = ^(int number) {
return value * number;
};
// 使用代码块
NSLog(@"%d", myBlockFirst(7));
// 使用代码块时通常不需要创建一个代码块变量,而是在代码中内联代码块中的内容。
// 通常,你会需要一个将代码块作为参数的方法或函数
NSArray *array = [NSArray arrayWithObjects:@"Amir", @"Mishal", @"Irrum", @"Adam", nil];
NSLog(@"Unsorted Array %@", array);
// 注意,这里的大括号后面没有分号
NSArray *sortedArray = [array sortedArrayUsingComparator:^(NSString *object1, NSString *object2) {
return [object1 compare:object2];
}];
NSLog(@"Sorted Array %@", sortedArray);
// 使用typedef定义代码块
typedef double (^sumNumber)(double num1, double num2);
sumNumber sumMethod = ^(double num1, double num2) {
return num1 + num2;
};
NSLog(@"result is %.2f", sumMethod(3, 8));
typedef int (^sumNumber1)(void);
// 如果这里不是静态变量,那么下面第二个输出语句依然输出200
// 即,a = 20和b = 50没有改变计算出的值
// 因为变量是本地的,即局部变量,代码块在定义时复制并保存他们的状态。所以,两次都输出200
// 如果将a和b改为static,即全局变量,那么
// 第二个就输出1000
int a = 10, b = 20;
sumNumber1 sumMethod1 = ^(void){
return a * b;
};
NSLog(@"%d", sumMethod1());
a = 20;
b = 50;
NSLog(@"%d", sumMethod1());
// __block变量
// 本地变量会被代码块作为常量获取到。如果想要修改它们的值,必须将他们声明为__block变量
// 注意block前面是两个下划线,不是一个
typedef int (^sumNumber3) (int num1, int num2);
__block int c = 8;
sumNumber3 sumMethod3 = ^(int num1, int num2){
c = num1 + num2;
return c;
};
NSLog(@"%d", sumMethod3(2, 9));
}
return 0;
}