zoukankan      html  css  js  c++  java
  • 小白学开发(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();     //   这里就能够通过指针来调用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



  • 相关阅读:
    问题解决:访问自己搭建网页时出现:此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。
    cracer教程5----漏洞分析(下)
    cracer教程3----信息收集
    linux3
    pwdump7的用法及其hash值解密
    maven scope含义的说明
    Spark2.0协同过滤与ALS算法介绍
    Jmeter压力测试工具安装及使用教程
    过滤器(Filter)与拦截器(Interceptor )区别
    @Value()读取配置文件属性,读出值为null的问题
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6964740.html
Copyright © 2011-2022 走看看