IOS block

截取了其中block部分的内容 留给自己看

原帖地址:http://blog.163.com/saai_2007/blog/static/16945039820121171029250/

Delegate (协议也就是protocol):
1. 声明Delegate: (通常写在一个.h文件中,这样容易import)
@protocol xxxDelegate <ParentClass>
@optional - (return_type) methodName:(certain_type) args; // optional delegate methods
- (return_type) methodName2:(certain_type) args; // the class who implements this delegate must implement this method.
@end

2.采用一个协议:
#import "xxxDelegate.h"
@interface xxxClassA<xxxDelegate, xxxxxxDelegate>
@end

@implementation xxxClassA

- (return_type) delegateMethod:(certain_type) args
{
// do something with the args
}

3. delegate 作为类变量:
@interface xxxClassB
@property(nonatomic, assign) id<xxxDelegate> delegate; //用assign , 否则会有引用循环。
...
@end

@implementation xxxClassB
- (void)dealloc
{
self.delegate = nil; // be a responsible delegate. not necessary .
[super dealloc];
}
@end

4. xxxClassA and xxxClassB 有什么关系:
xxxClassA *a = [[xxxClassA alloc] init];
xxxClassB *b = [[xxxClassB alloc] init];
b.delegate = a;
所以, b中可以通过调用[delegate  delegateMethod]; 而影响到 a.

Block (块) 是GCD(Grand Central Dispatch) 要执行的工作单元。 GCD是操作系统管理的一个线程池。
Block可以用做代替delegate机制的回调,也应用于并行开发(Concurrency programing)等技术中。
如何定义一个块:
1. 块的声明,(块的直接量,没名字,所以有时候也叫匿名函数):
^(argument_list){
body
};
2. 如何调用块: 
方法一:int j = ^(int n){return n*2;} (9); // j equals 18 now, (可以在直接量后面圆括号括起来要传入的参数, 块就被调用了)
方法二: 定义块指针。 return_type (^blockPointerName)(list of arguments);
如: int (^doubler)(int);
doubler = ^(int n){return n*2;};
int j = doubler(9);
以块指针作为函数的参数:
void someFunction(int (^blockArg) (int));
int (^doubler)(int ) = ^(int n){return n *2};
someFunction(doubler);
以块指针作为Objective-C方法(声明)的参数:
- (void) doSomethingWithBlockPointer: (float (^)(float)) blockPointer;
3.一个块如何访问其包围环境中的变量:
3.1 当执行流程通过块直接量时,块用于其环境中的一个本地变量的值,就是该本地变量的值。
int j  = 10;
int (^blockPtr)(int) = ^(int n) {return j + n;};
j = 20;
int k = blockPtr(5); // k is now 15, not 25.  
原因:实际上blockPtr在被赋值的时候,是用的当时j 的一个私有副本,所以这个副本j' 值为10.
3.2 块可以通过指针来访问静态和外部变量。 块当执行时会查找这些值,所以这些值不一定是定义该块时候的值。
static int j = 10;
int (^blockPtr)(int) = ^(int n){ return j +n;};
j = 20;
int k = blockPtr(5); // k is 25.
3.3 块对于本地变量的访问是只读的。
int j = 10;
void(^blockPtr)(void) = ^(void){j = 20;} ; // 编译错误。
3.4 如果本地有个变量保存了指向某个对象的指针,那么块不能修改这个变量指向别的对象,但是可以修改当前指向对象的值。
如: NSMutableArray *localArray = .......
void (^shortArray)(void) = ^(void){[localArray removeLastObject];}; // correct.
shortArray();
3.5 定义块变量: __block int integerBlockVariable;
对于块变量作用域中定义的任何块,它都是可见的,可共享的,可以修改的。
__block int j = 10;
void (^blockPtr_1) (void) = ^(void) {j += 15;};
void (^blockPtr_2) (void) = ^ (void) {j += 25;};
blockPtr_1(); // j  is now 25;
blockPtr_2(); // j is now 50;
4.块的内存管理:
4.1块其实是一个Objective-C类。块可以调用 copy, release, autorelease, 或者Block_copy(); Block_release(),来管理引用计数, 块是基于栈的,所以retain操作不起作用,必须用copy复制块(这有时候也是陷阱,不过我都没用过这么高级的东东,所以,初学者也太担心这个)。
4.2一个块在被复制的时候,它所引用的变量如果保存一个对象,那么这个对象会被保留(retain), 这个块释放时,也会释放这个对象(release).
4.3 块内调用的对于self的直接引用会导致self被保留(retain), 直接引用实例对象的变量,也会导致self 被保留(retain),方法中的本地变量,也会被保留(retain)。

5.块与函数指针的对比:
声明,定义都很像,就是* 和 ^符号的区别。
在应用上,主要的区别(我认为的):
5.1:用函数指针指向函数,你需要把函数内所用到的外部的变量,都作为参数传递给函数才可以用。
5.2: 函数指针的话,你必须事先定义这个函数,然后再声明函数指针,然后再赋值。Block你无需声明,可以用块直接量。

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值