对于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等)
b) strong,拥有关系,为这种属性设置新值后,设置方法会先保留新值,并释放旧值,然后再将新值设置上去
c) weak,非拥有关系,设置新值时,既不保留新值,也不释放旧值。属性所指对象被destroy时,属性值也会情况(nil out)
d) unsafe_unretained
e) copy,拥有关系,设置方法并不保留新值,而是拷贝新值。当属性类型为NSString时,经常使用此特性保证其封装性。
4.方法名,getter=
很简单,假如有一个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;