Effective Objective-C 2.0 观后感《一》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ws_752958369/article/details/82884175

1.多用字面量语法,可读性较强

2.尽量使用“向前申明”,而不是直接在头文件中导入。

3.尽量少用预处理指令来定义变量,换做类型常量static const/ extern NSString * const str来替代;

4.尽量使用枚举来定义状态,选项,状态码。可读性更强

5.理解NS_Enum和NS_Options来定义枚举的差异,进不进行位运算,2的幂次方

6.用switch处理枚举类型的值时,尽量不要实现default分支,这样的话加入新的枚举之后,编译器就会提示开发者,switch语句并没处理所有的枚举

7.理解对象和消息传递

8.理解属性,关键字:@synthesize name = _name; @dynamic name;

9.理解属性特质分为四种类型:1.原子性 (atomic,nonatomic)2.读写权限(readonly,readwrite)3.内存管理(assign,weak,strong,copy,unsafe_unretained)4.方法名(getter,setter)

1>>.原子性:atomic存取方法中添加同步锁,增加性能损耗,macOS环境下没有此风险;nonatomic常与@synchronized来搭配使用起到同步锁的作用.

2>>.读写权限:

assign:常用来修饰非OC对象的基本数据类型,如果用来修改OC对象,效果类似于weak不能增加引用计数,但是有点不一样的是当被指向对象被释放时,assign修改的只指针对象不会被释放,会实诚“野指针”,会产生EXC_BAD_指针错误。

weak:常用来修改OC对象,不会增加引用技术,和strong相对应。当指向地址被释放时,指针自动被释放。

strong:增加引用计数.设置方法先会保留新值,并释放旧值,然后再将新值设置上去。

copy:将新值进行一份拷贝,常用来保护不想被修改的数据的类型。

unsafe_unretain:特质与assign很相似,适用于OC对象类型,目标对象销毁时,也不会被释放。

3>>.getter=<name>

@property(nonatomic,getter=isOn)BOOL on;

10.在对象内部尽量直接使用实例变量来访问,而写入数据时最好采用“点语法”访问,其中涉及到“方法派发”,“键值观测”
 

-setName:(NSString *)name{

    self.name = name;

}

- (NNString *)name{

    return _name;

}

11.在初始化方法以及dealloc方法中,总是应该访问实例变量来读取数据。

12.在使用了“惰性初始化”(懒加载)技术时,必须使用属性的来读取数据。不然会导致没法初始化。

- (EOCBrain *)brain{
    if(_brain){
        _brain = [EOCBrain new];
    }
    return _brain;
}

13.理解“对象等同性”,理解“==”和“isEqual”的区别。

    //验证“==”与“isEqual”的区别
    NSString *str1 = @"lenka";
    NSString *str2 = [NSString stringWithFormat:@"lenka"];
    NSString *str3 = @"1";
    NSNumber *number = @1;
    
    NSLog(@"%d",str1 == str2);// false
    NSLog(@"%d",[str1 isEqual:str2]); //true
    NSLog(@"%d",[str1 isEqualToString:str2]);//true
    NSLog(@"%d",[str3 isEqual:number]);//false

究其原因:“==”操作符比较的是指针地址是否相同,而“isEqual”比较的是对象的数据类型和值是否相同,当确定是NSString类型的数据进行比较时,采用“isEqualToString”的比较速度较快。

14.

a.若想检测对象的等同性,请提供“isEqual”和hash方法。

b.相同的对象一定具有相同的哈希码,但是具有相同哈希码的对象不一定相同。

c.不要盲目地逐条检测每个属性,而是应该依照具体需求来制定检测方案.

d.编写hash方法时,应该使用计算速度快且哈希码碰撞几率低(碰撞指的是可能相同)的算法。

15."方法调配"

Method originMehtod = class_getInstanceMethod([NSString class],@selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class],@@selector(uppercaseString));
method_exchangedImplemetation(originMehtod,swappedMethod);

16.每个实例都有一个指向Class对象的指针isa,用以表明其类型,而这些Class对象构成了类的继承体系;如果对象类型在编译期间无法确认,那么应该使用类型信息查询方法来探知(isKindOf,isMemberOf);尽量使用类型信息查询方法来确定对象的类型,而不要直接比较(==)类对象。因为某些对象可能实现了消息转发功能。

API与接口设计

1.使用前缀避免命名空间冲突,apple保留“两字母前缀”的使用权利。

前缀的命名规则:项目名称简写,公司名称等。

猜你喜欢

转载自blog.csdn.net/ws_752958369/article/details/82884175