OC语言特性:
-1. OC是在C的语言基础上添加了面向对象特性。
-2. OC与C++,JAVA等面向对象的语言类似,采用的是一个“消息结构”而非”函数调用“,OC是由SmallTalk演化而来。
消息与函数调用的关键区别在于: 使用消息结构的语言,其运行时所执行的代码由运行环境来决定”动态绑定",而使用函数调用语言,则有编译器决定。
OC的重要工作都由”运行期组件“(runtime component)而非编译器完成,使用OC的面向对象特性所需的全部数据结构和函数都在运行期组件上面。运行期组件上面含有全部内存管理的方法,运行期组件本质上就是一种与开发者代码相连接的动态库,其代码能把开发者编写的所有程序黏合起来。这样,只需要更新运行期组件就能提升应用程序性能。
-3. OC的内存分配
NSString *str = @”test“
对象所占内存都在堆控件中(heap space)
栈帧”stack frame“里分配了一块地址,内存大小可以容下一枚指针,32位架构的计算机上是4字节,64位计算机上面是8字节
分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理
在OC代码中,不含*的变量可能用到栈空间(stack space),这些变量不会保存OC对象,比如CoreGraphics中的CGRect,整个系统框架都在使用这种结构体,因为如果改用OC对象来做的话,性能会受影响
-
技巧一: 引入头文件
尽量延后引入头文件的时机,避免在引用过程中一次性引入所有文件,增加编译时间
解决办法: 在.h 声明文件中,通过 @class 类名 (向前声明)
向前声明同时也解决了两个类相互引用的问题, 因为用import虽然可以解决,但是里面会有一个类无法被正确编译
特殊情况: 当引用的类遵守协议的时候,建议通过分类来遵守这些协议的实现
-
技巧二:多使用字面化语法
例如 NSarray *arr = @[@“s”,@“b”] 不要用 NSarray *arr = [[NSarray alloc]init];
NSNumber *num = @1
NSNumber *num = @1.0f
NSNumber *num = @1.0812
NSNumber *num = @YES
NSNumber *num = @“a”
NSNumber *num = @(x * y)
语法糖陷阱:
NSArray *array = @[@"1",temp,@"1”];
NSArray *array = [NSArray arrayWithObjects:@"1", nil,@"1"];
当temp == nil, 第一种创建数组的方式会崩溃, 第二种创建数组的方式只存入1个对象
总结:
- 使用字面量语法创建数组,字典,字符串,字符
- 通过下标操作来访问数组或者字典
- 用字面量创建数组,字典时,遇到nil会抛出异常,注意不要添加nil对象
-
技巧三: 避免使用宏定义
static const NSTimeInterval kTimeDuring = 3;
注意: 命名规范,当一个变量局限于某一编译单元(.m文件)内,应该加上k
千万不要在声明文件中宏定义,这等于是创建了一个全局变量,容易出错
本质:其实同时使用static和const,编译器不会创建符号,而是像#define一样处理
技巧四: 多使用枚举
定义:
typedef enum : NSUInteger {
TestOne = 1 << 0,
TestTwo = 1 << 1,
TestThree = 1 << 2,
} TestType;
使用:
if ((type & TestOne) > 0) {
NSLog(@"One");
}
if ((type & TestTwo) > 0) {
NSLog(@"Two");
}
网友评论