Effective Objective-C 2.0学习记录(二)

对于NSString,NSNumber,NSArray,NSDictionary使用字面语法编程

NSString *str = "Lawrence"; 
//优于
NSString *str = [[]NSString alloc] initWithString:@"Lawrence"];

NSNumber *one = @1; 
//优于 
NSNumber *one = [NSNumber numberWithInteger: 1];

NSArray *array = @[@"one", @"two", @"three"];
NSDictionary *dictionary = @[@"firstKey": @"first", @"secondKey": @"second", @"thirdKey": @"third"];

数组和字典中的数值不能够有nil值。
使用字面量语法建立出来的对象,是不可变的(immutable),若是想要可变的版本,须要拷贝一份,数组

NSMutableArray *mutableArray = [@[@1, @2, @3, @4] mutableCopy];

尽可能不用#define去定义常量,尽可能不要在头文件中定义常量
const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)安全

使用枚举变量表示状态,选项,状态码并发

属性特质
1.原子性,atomic/nonatomic,原子性,在并发编程中,若是某操做具有总体性,系统其余部分没法查看其中间过程的临时结果,只能看到初始值和结束值,那么这个操做就是原子性的
经过加锁,确保原子性。在iOS中,atomic使用会有较大的性能开销,也不能完成确保线程安全。
2.读/写权限, readwrite和readonly
3.内存管理语义性能

a) assign,设置方法,只针对scalar type(如CGFloat, NSInteger等)atom

b) strong,拥有关系,为这种属性设置新值后,设置方法会先保留新值,并释放旧值,而后再将新值设置上去线程

c) weak,非拥有关系,设置新值时,既不保留新值,也不释放旧值。属性所指对象被destroy时,属性值也会状况(nil out)scala

d) unsafe_unretained指针

e) copy,拥有关系,设置方法并不保留新值,而是拷贝新值。当属性类型为NSString时,常常使用此特性保证其封装性。
4.方法名,getter= code

很简单,假若有一个NSMutableString,如今用他给一个retain修饰 NSString赋值,那么只是将NSString指向了NSMutableString所指向的位置,并对NSMUtbaleString计数器加一,此时,若是对NSMutableString进行修改,也会致使NSString的值修改,原则上这是不容许的. 若是是copy修饰的NSString对象,在用NSMutableString给他赋值时,会进行深拷贝,及把内容也给拷贝了一份,二者指向不一样的位置,即便改变了NSMutableString的值,NSString的值也不会改变.因此用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引发后者值变化而用的.

在对象内存尽可能直接访问实例变量,属性访问,self.instance,直接访问,_instance
读取时使用直接访问,写入数据是使用属性访问
懒加载,必须经过属性访问

- (Person *)person {
    if (!_person) {
        _person = [Person new];
        ...
    }
    return _person;
}

对象等同性,

//You need to implement -isEqual: and -hash methods for your Request class.
-(BOOL)isEqualTo:(Object *)object;  -(NSUInteger)hash;
相关文章
相关标签/搜索