Effective Objective-C 2.0 学习笔记之一

第1条:在类的头文件中尽量少引入其他头文件.

(1)用@class 在头文件中进行前向引用,再在实现文件中#import该头文件,解决了两个类相互引用的问题.
(2)代理协议(protocol delegate)可用分类(category)进行化解.再不行就把协议单独放在一个文件中,再引入.

第2条:多用字面量语法,少用与之相关类方法.

NSNumer 类型:@2
NSArray类型:@[]
NSDictionary类型:@{key1:value1,key2:value2,key3:value3}
这种可用防止在collection中插入nil而不自知,dictionary 可以用dict[@”“]这种明了的方式获取数值.

第3条:多用类型常量,少用#define 预处理指令

(1)如果是只在类内部用则像这样:

static const NSTimeInterval kAnimationDuration = 0.3;

(2)如果是在外部也用到那么像这样:
在.h文件中:

extern NSString *const ZJLoginManagerDidLoginNotification;

在.m中

extern NSString *const ZJLoginManagerDidLoginNotification = @"ZJLoginManagerDidLoginNotification"

(3)常用的命名方法是:若局限于.m文件(编译单元中)则在前面加个k,如果暴露给外面的类用那么通常以类名作为前缀.

第4条:用枚举表示状态、选项、状态码

(1)typedef NS_ENUM(NSInteger, ZJConnectionState) {
ZJConnectionStateDisConnected,
ZJConnectionStateConnecting,
ZJConnectionStateConnected
};
其中原型是这样的

typedef NS_ENUM(<#_type#>, <#_name#>) <#new#>;

前面的是说这个枚举底层的数据类型.第二个参数是枚举的名称,相当于这样的:

enum ZJConnectionState{
    ZJConnectionStateDisConnected,//默认是0,下一个递增,也可以指定
    ZJConnectionStateConnecting,
    ZJConnectionStateConnected
};

typedef enum ZJConnectionState:NSInteger ZJConnectionState;

NSInteger这个数据类型这是C++11中新添加的特性.
那就可以这样直接用:

@property (nonatomic,assign) ZJConnectionState _currentState;
    switch (__currentState) {
        case ZJConnectionStateConnected:{
            //如何
            break;
        }
        case ZJConnectionStateConnecting:{
            //又如何
            break;
        }
            case ZJConnectionStateDisConnected:{
            //奈何
            break;
        }
    }

注意:这里面去掉了default 分支,如果用枚举的话最好不要这个分支,否则编译器会警告。

第5条:属性这个概念

属性就是用于封装对象中的数据的特性。
(1)尽量不要直接访问实例变量而不定义属性,而是应该通过属性的存取方法.
(2)@dynamic可以让编译器不合成存取方法或实例变量.在.m文件中声明.
(3)使用属性可以充分使用为相关属性所设定的”内存管理语义”:在arc下:
@assign :用于定义纯数据类型:NSInteger ,int,BOOL这种等.(默认的就是这个关键字)
@strong:拥有者关系的,设置方法时会先retain 新值,release 旧值,再赋新值.
@weak:非持有者的关系,在对象销毁时,会将该指针变量设为nil
@unsafe_unretained,为了向下兼容iOS 4一下weak出现之前的,和weak的区别是销毁对象后不会设为nil。
@copy.和strong类似.但是不是retain而是直接拷贝,在用于NSString 这样的对象时,用copy关键字更安全.因为可能在setter方法传过来的可能是NSMutableString ,后者是前者的子类,是可以改的,那么就可能被别人在不经意间修改,用copy就避免了这种情况。
@nonatomic,非原子操作,不是线程安全的,但是提升了性能.

第6条:在对象内部尽量直接访问实例变量

(1)在对象以外访问实例变量时,总是应该通过属性来做.建议在读取实例变量的时候采用直接访问的形式,在这种情况下速度最快,在设置实例变量的时候通过属性来做,否则如果直接访问实例变量的时候,那就绕过了先关属性锁定义的”内存管理语义”例如:在ARC 下直接访问一个copy属性时,那就不会拷贝改属性,只会retain 新值, release 旧值.
(2)在初始化及dealloc中总是应该通过实例变量来读写数据
(3)在 延时初始化中(属性不常用而且创建成本较高,在getter方法中执行延时初始化),这时要用过属性来读取数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值