• Objective-C 中的对象关联(Associated Objects)

    ###目录 什么是对象关联(Associated Objects) 如何使用 注意事项 参考资料 什么是对象关联(Associated Objects) 对象关联是Objective-C 2.0运行时的一个特性,起始于OS X Snow Leopard和iOS 4。我们有时候需要在对象中存放一些相关的信息,而又无法通过别的手段实现时,就可以把这些信息通过对象关联的方法与对象关联起来,在需要的时候通过对应的 key 就可以获取到对象的这些信息,比如说我们可以在 Category 中通过对象关联添加自定义的属性。对象关联通过 <objc/runtime.h> 中定义的三个方法实现的: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); id objc_getAssociatedObject(id object, const void *key); objc_removeAssociatedObjects(id object); 如何使用对象关联 我们可以使用关联对象在 Category 中添加自定义的属性,比如为一个 GHPerson 类添加一个体重的属性(weight): GHPerson+GHAssociatedObject.h #import "GHPerson.h" @interface GHPerson (GHAssociatedObject)...


  • 关于对象等同性判断

    我们经常会遇到判断两个对象是否相等的的情况,如果食用 == 操作符来进行判断,比较出来多结果不一定是我们想要的,因为 == 操作符比较的事两个对象对指针,而不是对象的值。 NSObject 协议中有两个用语判断等同性的关键方法: - (NSUInteger)hash; - (BOOL)isEqual:(id)object; NSObject类对其的默认实现为当且仅当其指针完全相同的时候,两个对象才相等。我们要实现自己的对象等同性就要覆写这两个方法。 有一点要理解,如果 “isEqual:” 方法判断两个对象相等,那么其 hash 方法也必须返回同一个值,但是,如果两个对象的 hash 方法返回同一个值, “isEqual:” 方法却未必认为二者相等。 假如有一个Person类如下: @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSNumber *age; @end 我们实现其等同性判断的步骤如下: 编写一个等同性判定方法,类似 NSString 类中的 isEqualToString: 方法,我们这里可以声明为 isEqualToPerson:. 覆写 isEqual: 方法和 hash 方法. 具体实现如下:...


  • Foundation 框架中集合类的一些用法-NSArray

    目录 遍历 排序 过滤 其他 参考资料 遍历 普通for循环 for (NSInteger n = 0 ; n < [array count]; n ++) { } for in 方式(NSFastEnumeration方式) 该方式无法获取到数组的下标,在不需要下标且数组元素很多的时候,可以用这种方式 for (id object in array) { } enumerateObjectsUsingBlock方式 数组遍历的 block 方式 ,其中的stop标志提供了一个优雅的停止遍历的方法,当 *stop = Yes 的时候,遍历就会停止 [array enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {...


  • KVO 简介

    目录 什么是KVO? KVO使用流程 KVO实例 相关技巧 参考资料 什么是KVO? KVO提供了一种观察者机制,当指定的对象的属性发生变化的时候,观察者就会收到通知,我们可以根据通知来进行UI更新等操作。它能降低代码之间的藕合度,显著减少开发者编写的代码量。KVO 是 Cocoa 的一项特性,我们可以在 Foundation 的框架里找到它。 KVO使用流程 添加观察者(注册KVO),一般在观察者对象初始化的时候,添加观察者 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; 属性变化时的回调 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 移除观察者(注销KVO),一般在观察者对象释放的时候移除,比如在dealloc中移除 - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context KVO实例 这里举一个例子,比如我有一个Person的对象如下: Person.h @interface Person : NSObject @property (nonatomic, strong)...


  • iOS 中的字节序

    起因 最近在做 iOS 蓝牙开发的时候,将多字节数据从APP端发到蓝牙设备端的时候,发现字节顺序都是反的,比如发送一个 0x0500 的数据给蓝牙设备端,设备端收到以后就变成了0x0005,研究发现这就是字节序不对导致的问题。 什么是字节序 采用维基百科的解释如下: 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。 而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。 例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23,..。而小端法将是:0x100: 67, 0x101: 45,.. 相关体系 x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。 Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。 网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。伯克利socket API定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。 ####iOS中的字节序 if (NSHostByteOrder() == NS_LittleEndian) {...