小白學開發(iOS)OC_ block數據類型(2015-08-08)
//
// main.m
// block數據類型
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Calculate.h"
// 定義一個函數
void test()
{
NSLog(@"test函數");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
數據類型的功能特點:
1. 作為參數傳遞
2. 作為函數返回值】
3. 聲明變量
OC中的數據類型:
1. 對象類型(NSObject * obj)
2. id
3. BOOL
4. block
5. SEL
6. 基本數據類型
*/
// 註意:block數據類型 和 指向函數的指針類似
// 指向函數的指針例如以下:
int (*myPoint)() = test;
myPoint(); // 這裏就能夠通過指針來調用
// 註意:然而指向函數的指針不能直接指向函數即一個代碼塊,必須通過函數名來指向
// block就是彌補了這一點,可以直接保存一個函數體(代碼塊)
void (^myBlock)() = ^{
NSLog(@"jajajaj");
}; // 這裏myBlock就代表後面括號裏的代碼塊
myBlock();
// 也能夠傳入參數,有返回值
/*
int (^sumBlock)(int a, int b) = ^ int(int a, int b) {
return a + b;
};
int result = sumBlock(10, 20);
NSLog(@"%d", result);
*/
// block作為參數傳遞(block實際指向的是一個函數或者代碼塊,那麽將這個函數或代碼塊作為參數傳遞)
// 使用場景:當在開發中,你發現一個方法中的算法,能夠有多種實現,你一時還不能確定用哪種更好,你就能夠吧方法中當中一個參數定義成block方式
/*
int (^jianBlock)(int a, int b) = ^int(int a, int b){
return a - b;
};
Calculate *cal = [[Calculate alloc]init];
int jian = [cal calculateWithNumber1:10 andNumber2:20 andCalculate:jianBlock];
NSLog(@"%d",jian);
*/
// 註意:假設在作用域範圍之內,block是能夠使用變量的,可是要在block代碼塊中改變非塊中變量的值就要在變量前加__block
// int x =0;
__block int x = 0;
int (^sumBlock)(int a, int b) = ^ int(int a, int b) {
int result = (a + b) + x; // 這個是正確的
x = result; //這裏就必需要求在定義x的時候前加__block
return result;
};
Calculate *cal = [[Calculate alloc]init];
int sum = [cal calculateWithNumber1:10 andNumber2:20 andCalculate:sumBlock];
NSLog(@"sum = %d",sum);
NSLog(@"x = %d",x);
}
return 0;
}
//
// Calculate.h
// OC的特有語法
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
// 創建一個別名為calculateBlock的block。返回值為int。有兩個int類型的參數,這裏與指向函數的指針類似
typedef int (^calculateBlock)(int a, int b);
@interface Calculate : NSObject
// 將block作為參數傳入
// 這個函數的作用是計算兩個數的加減乘除等運算,前兩個參數是運算的數字。block類型的第三個參數的計算方法
- (int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate;
@end
//
// Calculate.m
// OC的特有語法
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Calculate.h"
@implementation Calculate
- (int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate
{
return calculate(number1, number2);
}
@end
小白學開發(iOS)OC_ block數據類型(2015-08-08)