`

Objective-c的Block

    博客分类:
  • ios7
 
阅读更多

 

Block的语法不再赘述,了解一下其他的东西

 

1、Block的存储域

block实际上是一个OC对象,根据它的存储域不同可以将block分为三种情况,一种是存在数据区,一种是存在堆上,一种是存在栈上。在栈上的block对象,在它的作用域结束后会被立即释放,要向保存这个block对象,需要调用copy方法。在数据区的block发现不怎么常用,不再介绍。在一些情况下,我们不用显示的调用copy方法,block会自动的将block复制到堆上,例如:

 

block作为返回值返回。

将block复制给被__strong修饰的id类型变量或者Block类型的变量。

在cocoa框架中的方法中函数签名有usingBlock的

GCD中

 

2、block截获对象

看代码

 

- (blk_t)createBlock
{
    blk_t blk;
    NSMutableArray *array = [[NSMutableArray alloc]init];

    blk = ^(id obj){
        [array addObject:obj];
        NSLog(@"%d",array.count);
    };
    return blk;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    blk_t blk = [self createBlock];
    blk(@"sd");
    blk(@"sd");
    blk(@"sd");
    
    
    return YES;
}

 执行结果

 

 

2014-01-01 20:05:43.012 GCDDemo[7765:70b] 1
2014-01-01 20:05:43.012 GCDDemo[7765:70b] 2
2014-01-01 20:05:43.013 GCDDemo[7765:70b] 3

 

 

blk作为返回值被复制到堆上,blk截获了array,所以即使array作用域结束了,array没被释放,我们依然能够使用这个变量。

 

3、block的循环引用

 

@interface Test: NSObject
{
    blk_t blk;
}

...
在实现文件中某个方法中用到了
 blk = ^(id obj){
        NSLog(@"%@",self);
    };

 这样就引起了循环引用,解决方案是

 

第一种

 
id __weak tmp = self;
blk = ^(id obj){
        
        NSLog(@"%@",tmp);
    };

 第二种

 

 

 __block id tmp = self;
 blk = ^(id obj){
       
        NSLog(@"%@",tmp);
tmp = nil;
    };

 缺点是必须执行这个block否则,还是会引起循环引用。

 

分享到:
评论

相关推荐

    The Objective-C block utilities you always wish you had..zip

    在这个名为"The Objective-C block utilities you always wish you had"的压缩包中,很显然,它包含了一些用于增强Objective-C中Block功能的实用工具。Blocks是Objective-C中的一个强大特性,它们允许程序员定义可...

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

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

    Objective-C2.0程序设计第二版中文版及代码

    1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    Objective-C基础教程(Learn Objective-C)随书源码下载

    Objective-C是C语言的超集,它扩展了C语言,加入了面向对象的特性。面向对象编程(OOP)的核心概念包括类、对象、继承、封装和多态。Objective-C通过消息传递机制实现了这些概念,使得代码更加模块化和可维护。 2....

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    7. **Block和GCD**:Block是Objective-C中的匿名函数,可以用于简化回调和并发处理。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,书中可能讲解如何利用它们优化程序性能。 8. **Cocoa Touch和App...

    Effective Objective-C 2.0

    1. Objective-C语言简介:Objective-C是一种通用的编程语言,其被广泛应用于苹果公司的macOS、iOS、watchOS和tvOS操作系统。它基于C语言,并加入了Smalltalk风格的消息传递机制。 2. 类和消息机制:Objective-C语言...

    Objective-C2.0程序设计习题官方答案

    Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...

    从 C++ 到 Objective-C 快速精通

    C++11也引入了类似的概念,但Objective-C的Block在语法和使用上有所不同。 6. Foundation框架:Objective-C的基础库Foundation框架提供了许多核心的类和功能,如NSArray、NSDictionary等容器类,以及NSString、...

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

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

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

    - **块(Block)**:块是一种匿名函数,在Objective-C中常用于回调函数或者异步操作的完成处理。 #### 应用场景 - **iOS应用开发**:Objective-C是开发iOS应用的主要语言之一,尤其适合于那些需要高性能和复杂用户...

    Objective-C高级编程†

    Block(块)是Objective-C的另一项重要特性,它是一种内联函数,可以捕获并存储其定义时的作用域内的变量。Block常用于异步操作的回调,如网络请求或GCD(Grand Central Dispatch)。 Foundation框架是Objective-C...

    Objective-C示例代码1

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

    深入浅出讲objective-c

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

    objective-c基础教程(附源代码)

    首先,Objective-C是在C语言的基础上扩展的,因此,理解C语言的基本语法是学习Objective-C的前提。它引入了消息传递机制,这是Objective-C的关键特性,允许对象之间进行通信。消息传递类似于函数调用,但更加灵活,...

    0基础iOS开发学习计划Objective-c语言内容概述.doc

    Objective-C是一种结合了C语言特性和面向对象编程思想的语言,它是苹果iOS和macOS应用开发的基础语言之一。Objective-C诞生于20世纪80年代,由Brace N. Koch等人设计并发展起来。随着iOS和macOS系统的流行,...

    Learn Objective-C On The Mac(英文PDF+SourceCode)

    8. **Blocks与GCD**:介绍Objective-C中的Block语法和Grand Central Dispatch(GCD),用于并行处理和异步编程。 9. **Category与Extension**:解释如何使用Category扩展已有的类,以及Class Extension的概念和用途...

    objective-c学习资料

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

    iphone(Objective-C)

    Objective-C是由C语言扩展而来的,增加了面向对象的特性,使得它更适合构建复杂的、可维护的软件系统。 在学习Objective-C时,首先需要理解其基础语法,包括类(Class)、对象(Object)、消息传递(Message ...

Global site tag (gtag.js) - Google Analytics