一.#import 如果在各自的头文件中引入对方的头文件,则会导致“循环引用” 使用#import 而非 #include指令虽然不会导致死循环,但却意味着这两个类里又一个无法被正确编译。
二.多用常量 少用#define 预处理指令
宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查
常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查
常量
全局常量:不管你定义在任何文件夹,外部都能访问
constNSString*HSCoder =@"汉斯哈哈哈";
局部常量:用static修饰后,不能提供外界访问
staticconstNSString*HSCoder =@"汉斯哈哈哈";
const修饰位置不同,代表什么?
1.const NSString *HSCoder = @"汉斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改
2.NSString const *HSCoder = @"汉斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改
3.NSString * const HSCoder = @"汉斯哈哈哈";
"HSCoder"不能被修改,"*HSCoder"能被修改
const右边的总不能被修改
#define KANIMATION_DURATION 0.3
static const NSTimerInterval KAnimationDuration = 0.3;
常量名称:常量在.m中则在前面添加字母k,若常量在类外可见则通常以类名为前缀。
常量的使用
#import
@interfaceSMConst :NSObject
externCGFloatconstSMMMMMMMMMFloat;
externNSString*constSMMMMMMMMMString;
@end
#import"SMConst.h"
@implementationSMConst
#if DEBUG
CGFloatconstSMMMMMMMMMFloat =100;
NSString*constSMMMMMMMMMString =@"ddd";
#else
CGFloatconstSMMMMMMMMMFloat =90;
NSString *constSMMMMMMMMMString =@"bbb";
#endif
@end
1.不要使用预处理指令定义常量,而借助编译器来确保常量正确,在.m文件中用static const 来声明常量
2.不要好似用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作。即使有热闹重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。
3.在实现文件中使用static const 来定义 “只在编译单元内可见常量”。由于此类常量不在全局符号表中,所以无须尾气名称加前缀。
4.在头文件中使用 extern 来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局富豪表中国年,所以其名称应该加以区隔,通常用与之相关的雷名做前缀。
三.用枚举表示状态、选项 状态码.
四.属性的特质
@property (nonatomic,readwrite,copy) NSString *name;
iOS Runtime 引用 iOS~runtime理解