目录结构:
1.了解objective-c的起源
2.在类的头文件中尽量少引用其他头文件
3.多用字面量语法,少用与之等价的方法
4. 多用类型常量,少用#define预处理指令
5.用枚举表示状态,选项,状态码。
objective-c的重要工作由运行期组件而非编译器完成。本质上是一种与开发者所编代码相链接的动态库。
分配在堆中的内存需要直接管理,分配在栈中的则会在其栈帧弹出时自动清除。
objective-c将堆内存管理抽象出来,不需要malloc,free来分配,释放内存,而是抽象为一套内存管理架构,叫引用计数。
采用向前申明,是引用更加优雅。在A类的头文件使用B类型的属性,可以在头文件里加@class B;在实现文件里添加B类型头文件。#import "B.h";
这样可以减少A类的使用者引用头文件的数量,进而减少编译时间。另一方又可以解决头文件循环引用问题,比如这时B类又存在使用A类型的属性,需要引用A类的头文件。相互间循环引用头文件,导致编译出错。
向前申明的局限性:使用超类需要引用超类的头文件。遵从某个协议,需要有完整定义,不能使用向前申明。
某些协议不用单独写头文件,如委托协议,最好在类的实现文件申明实现了该协议。并把实现代码放在"class-continuation"分类里。这样就不需要讲其放在公共头文件里。
使用字面量语法可以缩减源代码长度,增加可读性。NSNumber @1 ; NSArray @[@"a",@"b"]; NSDictionary @{@"a":@"key1",@"b":@"key2"};
可变数组跟字典,可以分别使用下标法和访问键的方法找到对应的元素,如mutablearray[1];mutabledictionary[@"key"];
字面量语法限制,除字符串外,所创建的对象必须属于Foundation框架才行。
宏定义常量无法指定类型信息,可能导致所有这类定义的宏一律换成了一样的信息,可能需要的是不同类型的值。
如#define ANIMATION_DURATION 0.3,与static const NSTimeInterval kAnimationDuration = 0.3; (static 和const 必须同时使用.这样编译器不会创建符号,而是会像define一样,把遇到的变量替换成常量 )
常量命名法:常量局限在编译单元内,以k开头如kAnimationDuration.若常量在类之外可见,以类名开头,如EOCViewClassAnimationDuration.
如果需要外部可见,需要定义成extern NSString *const EOCStringConstant(头文件);NSString *const EOCStringConstant = @"value";(实现文件)。会放在全局符号表中。
枚举类型指定底层数据类型:
enum EOCConnectType:NSInteger{ /**/};
新的用法:typedef NS_ENUM(NSInteger,EOCConnectType){/**/}