IOS代码的高效方法

2018-10-22  本文已影响0人  我是繁星

《Effective Objective-C》读书笔记:

1.了解OC起源:

消息结构:由所应执行的代码由运行环境决定。
函数调用:执行的代码由编译器决定。
堆内存:由程序员直接管理。
栈内存:会在其栈帧弹出时自动清理。

OC是消息结构而非函数调用,OC的消息结构是由运行期组件完成的,而非编译器,本质就是一个与开发者代码相连接的动态库,所以这也是消息结构语言相比函数调用语言函数执行效率较低的原因,而要提升应用性能,只需优化运行期组件就可以了,对于开发者是不可见的。

OC是C的超集,对于NSString * str = @"String"的理解,str本身是一个NSString *的指针,指向一个字符串对象。字符串对象存储在堆内存中,str这个指针对象存储在栈内存中(在32位架构的计算机是4字节,在64位架构的计算机是8字节),这与C语言相同。

在OC中定义的不含*的变量,他们可能都会使用栈空间,例如CoreGraphics框架中的CGRect,整个系统框架中都会使用这个结构体,如果使用对象,那么效率会有所降低,因为堆内存设计到内存分配和释放。

2.在类的头文件中尽量少引入其他头文件

如果只是提及到这个类,并未用到其他建议使用@class向前声明的方式引用,这样可以降低类之间的耦合。

3.多用字面量语法,少用与之等价的方法

@(2) @{@"first":@"matt"} @[@"first",@"second"]
因为字面量更安全体,现如下:
NSArray * array = [NSArray arrayWithObjects:obj1、obj2、obj3,nil]
NSArray * array = @[obj1、obj2、obj3]
如果obj2位nil,字面量会抛出异常,方法创建的则会在obj2的位置终止,最终array包含一个元素obj1不会抛出异常
字面量更加简明扼要

4.多用类型常量、少用#define预处理指令

#define Duration 0.3
static const NSTimeInterval kAnimationDuration = 0.3
宏定义不包含类型信息,编译器只会在编译前据此执行查找与替换操作,重复了会覆盖
用static const定义“只在编译单元内可见的常量”,文件外部不可见,无需因为其他文件中重名来添加前缀。
如果想要全局访问,可以添加Extern关键字,注意要对其名称进行区分,加前缀。

5.用枚举表示状态、选项状态码

在C++11标准中修订了枚举的特性,可以指明用何种底层数据类型来保存枚举类型的变量,好处是可以向前声明@class枚举变量了

enum State{
    stop,
    start,
};
typedef enum State State;

enum State:NSInteger{
    stop,
    start,
};
typedef enum State State;

如果枚举按照要求可以彼此组合例如,设置屏幕支持的方向 UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft这就需要用到按位枚举

typedef enum UIViewAutoresizing : NSUInteger {
    UIViewAutoresizingNone = 0,
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
    UIViewAutoresizingFlexibleWidth = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin = 1 << 3,
    UIViewAutoresizingFlexibleHeight = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
} UIViewAutoresizing;

用二进制意思就是,
UIViewAutoresizingNone000000
UIViewAutoresizingFlexibleLeftMargin向左移一位000010
UIViewAutoresizingFlexibleWidth000010基础上向左移一位 000100
以此类推...
UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth就等于000110

NS_ENUM和NS_OPTIONS这两个宏的好处是会判断是否支持枚举新特性(前面说的底层数据类型)。
按位操作的枚举要用NS_OPTIONS,原因是C++模式下在用运算符操作的时候,结果是枚举的底层数据类型也就是NSUInterger,并不会隐士转换为当前枚举类型,所以要用NS_OPTIONS。为了兼容C++模式

在switch语句中不要实现default分支,如果加入会有警告提示。

持续更新中..........

上一篇 下一篇

猜你喜欢

热点阅读