`

Objective-C语法之代码块(block)的使用 .

    博客分类:
  • oc
阅读更多
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:


[img]

[/img]

按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); // result是 28





1、参数是NSString*的代码块
  void (^printBlock)(NSString *x);
        printBlock = ^(NSString* str)
        {
            NSLog(@"print:%@", str);
        };
        printBlock(@"hello world!");

运行结果是:print:hello world!




2、代码用在字符串数组排序
  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、代码块的递归调用
代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用

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、在代码块中使用局部变量和全局变量

4.1在代码块中可以使用和改变全局变量
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




而局部变量可以使用,但是不能改变。
        int local = 500;
        void(^block)(void) = ^(void)
        {
//            local++;
            NSLog(@"local:%d", local);
        };
        block();
        NSLog(@"local:%d", local);


在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block

        __block int local = 500;
        void(^block)(void) = ^(void)
        {
            local++;
            NSLog(@"local:%d", local);
        };
        block();
        NSLog(@"local:%d", local);



运行结果:local:501


                    local:501




  • 大小: 68.7 KB
分享到:
评论

相关推荐

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...

    Objective-C语法之走进iphone的开发世界那些事儿

    块(Block)是Objective-C中的匿名函数,可以在代码中定义并立即使用,类似于其他语言的lambda表达式。它们对于处理异步操作,如网络请求,非常有用。 Foundation框架是Objective-C的基础,提供了许多基础类,如...

    Objective-C 基础语法学习项目

    ### Objective-C基础语法学习项目详解 #### 一、Objective-C简介 Objective-C是一种面向对象的编程语言,由Smalltalk和C语言发展而来。它在20世纪80年代初被设计出来,并在苹果公司开发iOS和macOS应用程序时得到了...

    Objective-C语言教程与案例.zip

    还可能讲解了Objective-C的特殊特性,如类别(Category)、协议(Protocol)和块(Block)。 2. **语法结构**:Objective-C的语法有其独特性,比如它的方法定义和调用方式,以及在C语言基础上添加的“@”符号,如@...

    IOS应用源码——Objective-C基础教程 随书源码.zip

    6. **Block(块)**:Objective-C的块是一种匿名函数,常用于异步操作或作为参数传递。理解Block的定义、使用和作用域规则。 7. **内存管理**:了解ARC(Automatic Reference Counting)自动引用计数,它是...

    Objective-C示例代码1

    10. **Block(闭包)**:Objective-C支持块语法,`FractionDemo`可能包含使用块作为参数或返回值的方法,用于实现异步操作或回调。 这些只是Objective-C编程中的一部分核心概念,实际的`FractionDemo`代码会根据...

    Objective-C

    Objective-C是一种面向对象的编程语言,它是在C语言的基础上扩展了Smalltalk的类和消息传递机制,由Stepstone公司于1983年开发,并在苹果的Mac OS X和iOS操作系统上广泛使用。这个压缩包文件包含了一系列关于...

    Objective-C基础教程.pdf.zip

    Block(块)是Objective-C的匿名函数,可以作为参数传递,也可以作为返回值。它们在处理异步任务、排序和过滤数组等方面非常有用。 此外,Foundation框架是Objective-C开发的基础,提供了许多基本的数据类型和实用...

    Objective-C.2.0程序设计(中文版) 高清PDF

    在Objective-C 2.0中,引入了一些重要的改进,如Block(代码块)和ARC(自动引用计数)。Block允许在代码中定义可复用的匿名函数,使得处理回调和并发更加方便。ARC则自动化了内存管理,减少了手动内存管理导致的...

    Objective-C 基础教程源码

    1. Block:Objective-C支持块(Block),一种内联函数,可以捕获并存储其所在作用域的变量。常用于异步编程。 2. GCD(Grand Central Dispatch):苹果提供的多线程解决方案,使用Block简化并发编程。 七、...

    Objective-C基础教程.rar

    Objective-C是在C语言的基础上扩展的,它保留了C的语法结构,并添加了面向对象编程的特性。在学习Objective-C时,你需要了解C语言的基本概念,如变量、数据类型、控制结构等。同时,Objective-C引入了消息传递机制,...

    深入浅出讲objective-c

    1. **语法特性**:Objective-C是在C语言的基础上扩展的,保留了C的语法特性,同时引入了消息传递机制,使得它具有面向对象的能力。 2. **类和对象**:Objective-C中的所有数据结构都是基于类的,类是对象的模板,而...

    [Objective-C编程(第6版)]Programming in Objective-C

    - **特点**:Objective-C支持类、消息传递、继承等面向对象编程特性,并与C语言兼容,允许开发者直接在Objective-C代码中使用C代码。 ##### 2. 基础语法 - **变量和数据类型**:Objective-C支持多种内置数据类型,...

    objective-c学习资料

    Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,使得C语言具备了面向对象的能力。Objective-C的语法在某些方面与C++相似,但它的动态性更强,允许在运行时修改类和方法。 2. **类与对象**: ...

    是一个较为详细的Objective-C语言教程.docx

    这些控制结构可以帮助开发者根据不同的条件来执行相应的代码块。 ##### 2.3 函数与方法 在Objective-C中,通常将函数称为“方法”,并且它们被定义在类中。例如: ```objective-c // 函数声明 - (void)printHello...

    objective-c 2.0 课后习题答案

    Objective-C 2.0 是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,主要用于iOS和macOS的应用程序开发。Objective-C 2.0在Objective-C的基础上添加了一些新特性,使得代码更加简洁易读,提高了开发效率。...

    Objective-C 基础教程 源代码

    这个"Objective-C 基础教程 源代码"是为初学者设计的,旨在帮助他们理解并掌握Objective-C的基本概念、语法和编程技巧。通过学习这些源代码,你可以亲手实践编程,加深对语言特性的理解。 1. **Objective-C简介**:...

    Progrmming in Objective-C 2.0

    6. **Blocks和GCD**:Objective-C支持块(Block)语法,这是一种强大的匿名函数形式,常用于并发编程。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,结合Blocks可以方便地实现异步任务。 7. **...

Global site tag (gtag.js) - Google Analytics