懒加载
一般我们会在初始化方法中, 把成员变量都初始化出来, 但是有些成员变量比较耗资源, 如:NSDateFormatter, 而且不一定什么时候才会用到,
因此可以使用懒加载策略: 重写getter方法:
- (NSDateFormatter *)dateFormatter{
if (!_dateFormateer)
{
// 初始化变量
}
return _dateFormateer;
}
代码块
代码块如果在闭合的圆括号内的话, 会返回最后语句的值:
NSURL *url = ({
NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint];
[NSURL URLWithString:urlString];
});
这个特性可以使变量的作用域只在代码块中, 从而减少对其它作用域的污染, 从而缓解编程的世界性难题之一--变量命名
pragma 消除警告
#pragma clang diagnostic push // 准备压入一个警告消除标记
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" // 警告消除标记
[myObj performSelector:mySelector withObject:name]; // 需要消除警告的代码
#pragma clang diagnostic pop // 弹出这个警告消除标记, 以免在别的地方也不警告了
除此之外 还有:
#pragma clang diagnostic ignored "-Wdeprecated-declarations" // 方法弃用警告
#pragma clang diagnostic ignored "-Wincompatible-pointer-types" // 不兼容指针警告
#pragma clang diagnostic ignored "-Wunused-function" // 没有使用的函数
一般命名规则是 "-W警告提示名"
如果一个变量未使用, 但是你有别的意图, 想要消除警告可以:
#pragma unused (variable)
Block
定义包含有block的接口时, 提供一个单独的block比分别提供成功和失败block要好些, 因为很多情况下成功和失败都需要执行一部分代码.
成功的数据对象和失败的错误对象都在参数中, 因此必须保证:
- 数据对象和失败对象其中之一为非空, 另一则为空.
- 在检查时, 我们一般会检查数据对象是否为空, 一来我们更关心数据, 二来, 苹果提供的一些同步接口在成功的情况下也会像NSError中写入一些垃圾值.
Block作为属性要使用copy的内存管理方式, 确保在栈帧返回时block不会被释放掉而得不到执行
weakself 和 strongself的选择: 如果实例持有了这个block, 但是这个block又要使用self的方法, 则需要对self进行weak, 否则会造成循环引用。
慢慢来,一步一个巴掌印~~~