#ObjC

有段时间没看关于 iOS 的东西了,前段时间在翻 Instapaper 的时候看到了 [NSVALUE AND BOXED EXPRESSIONS][2] 这篇文章,就随便看了看,正好自己对这些也不是很了解,就记录下来。

在 Apple LLVM Compiler 4.0 支持嵌套表达式 (Boxed Expressions)。即可以用 @() 的方式生成相应的对象,例如:@1 相当于 [NSNumber numberWithInt:1];,@1 称为 NSNumber 字面量。ObjC 中还有集合字面量,以及通过下标来访问 OC 对象。下面介绍在 OC 中字面量的使用。

ObjC 是使用引用计数来管理对象内存的,关于引用计数更加详细的解释,可以看 [理解 iOS 的内存管理][5],这篇文章还讲了 ARC 下可能存在的内存管理问题。

ARC 是编译器的特性,在编译的时候自动插入管理引用计数的代码,给 ObjC 对象提供自动内存管理,并生成相应的 dealloc 方法。ARC 可以让你更加专注于编写代码的逻辑而不是去管理内存,但是在 ARC 下遵循 ObjC 的命名规则就显得很重要了。

关于 NSFastEnumeration 的基本介绍可以看这篇 [使自定义的类支持 iOS 的枚举方式][7]。

不多说废话,直接进主题。

事先可以看一下 [Comparison of Objective-C Enumeration Techniques][1] 和 [NSFastEnumeration / NSEnumerator][2],对比了 ObjC 中各种遍历方式。

在 StackOverflow 上看到 [这篇讨论][1] 的时候,让我发现了自己的盲区,所以写下这篇文章记录一下。

有一次在项目中使用的 enumerateObjectsUsingBlock 遍历数组的时候,使用了 return,当时没有多想,在 code review 的时候被同事指出,当时觉得不妥就改掉了,今天突然想起就去搜了一下。项目中好像没有直接跳出方法,而是执行到循环外面(这里的需求是当遍历到最后一个直接跳出循环,return 在 enumerateObjectsUsingBlock 相当于 continue,所以项目中会造成直接跳出循环)。

在利用 Objective-C 的开发中,我们需要创建许多的类,类包括成员变量和成员方法/类方法 (Objective-C 中没有类成员变量)。但是大部分 Obj-C 的类文件中都看不到成员变量的申明,我们更多看到的是形如: @property (nonatomic, copy) NSString *name; 。这是因为当我们这样写之后,Xcode 会自动为我们添加成员变量,并生成相应成员变量的存取方法。