1. 程式人生 > >小白學開發(iOS)OC_ block數據類型(2015-08-08)

小白學開發(iOS)OC_ block數據類型(2015-08-08)

main nsobject 改變 char typedef 能夠 div sel 方法

//

// 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(); // 這裏就能夠通過指針來調用

test函數

// 註意:然而指向函數的指針不能直接指向函數即一個代碼塊,必須通過函數名來指向

// 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>

// 創建一個別名為calculateBlockblock。返回值為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)