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"的压缩包中,很显然,它包含了一些用于增强Objective-C中Block功能的实用工具。Blocks是Objective-C中的一个强大特性,它们允许程序员定义可...
书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...
1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...
Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...
Objective-C是C语言的超集,它扩展了C语言,加入了面向对象的特性。面向对象编程(OOP)的核心概念包括类、对象、继承、封装和多态。Objective-C通过消息传递机制实现了这些概念,使得代码更加模块化和可维护。 2....
7. **Block和GCD**:Block是Objective-C中的匿名函数,可以用于简化回调和并发处理。Grand Central Dispatch(GCD)是Apple提供的多线程解决方案,书中可能讲解如何利用它们优化程序性能。 8. **Cocoa Touch和App...
1. Objective-C语言简介:Objective-C是一种通用的编程语言,其被广泛应用于苹果公司的macOS、iOS、watchOS和tvOS操作系统。它基于C语言,并加入了Smalltalk风格的消息传递机制。 2. 类和消息机制:Objective-C语言...
Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...
C++11也引入了类似的概念,但Objective-C的Block在语法和使用上有所不同。 6. Foundation框架:Objective-C的基础库Foundation框架提供了许多核心的类和功能,如NSArray、NSDictionary等容器类,以及NSString、...
还可能讲解了Objective-C的特殊特性,如类别(Category)、协议(Protocol)和块(Block)。 2. **语法结构**:Objective-C的语法有其独特性,比如它的方法定义和调用方式,以及在C语言基础上添加的“@”符号,如@...
- **块(Block)**:块是一种匿名函数,在Objective-C中常用于回调函数或者异步操作的完成处理。 #### 应用场景 - **iOS应用开发**:Objective-C是开发iOS应用的主要语言之一,尤其适合于那些需要高性能和复杂用户...
Block(块)是Objective-C的另一项重要特性,它是一种内联函数,可以捕获并存储其定义时的作用域内的变量。Block常用于异步操作的回调,如网络请求或GCD(Grand Central Dispatch)。 Foundation框架是Objective-C...
10. **Block(闭包)**:Objective-C支持块语法,`FractionDemo`可能包含使用块作为参数或返回值的方法,用于实现异步操作或回调。 这些只是Objective-C编程中的一部分核心概念,实际的`FractionDemo`代码会根据...
1. **语法特性**:Objective-C是在C语言的基础上扩展的,保留了C的语法特性,同时引入了消息传递机制,使得它具有面向对象的能力。 2. **类和对象**:Objective-C中的所有数据结构都是基于类的,类是对象的模板,而...
首先,Objective-C是在C语言的基础上扩展的,因此,理解C语言的基本语法是学习Objective-C的前提。它引入了消息传递机制,这是Objective-C的关键特性,允许对象之间进行通信。消息传递类似于函数调用,但更加灵活,...
Objective-C是一种结合了C语言特性和面向对象编程思想的语言,它是苹果iOS和macOS应用开发的基础语言之一。Objective-C诞生于20世纪80年代,由Brace N. Koch等人设计并发展起来。随着iOS和macOS系统的流行,...
8. **Blocks与GCD**:介绍Objective-C中的Block语法和Grand Central Dispatch(GCD),用于并行处理和异步编程。 9. **Category与Extension**:解释如何使用Category扩展已有的类,以及Class Extension的概念和用途...
Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,使得C语言具备了面向对象的能力。Objective-C的语法在某些方面与C++相似,但它的动态性更强,允许在运行时修改类和方法。 2. **类与对象**: ...
Objective-C是由C语言扩展而来的,增加了面向对象的特性,使得它更适合构建复杂的、可维护的软件系统。 在学习Objective-C时,首先需要理解其基础语法,包括类(Class)、对象(Object)、消息传递(Message ...