1.属性
assign : 纯量类型 例如 : CGFloat
strong : “拥有关系” 为这种属性设置新值时候,设置方法会先保留新值,并释放旧值,然后将新值设置上去
weak : “非拥有关系” 为这种属性设置新值时候,既不保留新值,也不释放旧值。属性所指的对象遭到摧毁时,属性值也会清空
unsafe_unretained : 不安全,当目标对象遭到销毁时,属性值不会自动清空,这一点和weak有区别
copy : 与strong类似,然而设置方法并不保留新值,而是将其 copy
2.在对象内部尽量直接访问实力变量
比较合理折中的方案: setter 方法时 用 self.xxx 因为这样可以控制对属性的写入操作;getter 方法时 最好用 _xxx 直接访问。
对于不经常用到的可以使用懒加载 访问
3.对象等同性:
想检测对象的等同性,请提供“isEqual:” 与 hash 方法
可以为自己的特定类定制等同性方法
- (BOOL) isEqualToPerson:( Person* )otherPerson{
if ( self == object ) return YES;
if ( ! [ _firstName isEqualToString:otherPerson.firstName ] ){
return NO;
}
…..
return YES;
}
4.“类族模式”
typededf NS_ENUM( NSUInteger, MKMYEmployeeType ){
MKMYEmployeeTypeDeveloper,
MKMYEmployeeTypeDesigner,
MKMYEmployeeTypeFinance,
};
+( MKMY )employeeWithType:( MKMYEmployeeType )type{
switch ( type ){
case MKMYEmployeeTypeDeveloper :
return [ MKMYEmployeeTypeDeveloper new ];
break;
case ...
// 在switch判断是枚举类型的时候,最好不用用defualt,因为这样在新增加枚举类型的时候,Xcode会报出警告
}
5 runTime语句
(1)发送消息: id returnValue = objc_msgSend( someObject,
@selector( messageName: ),
parameter);
第一个参数表示消息的接受者,第二个参数代表选择子,后续可以传多个参数
(2)“黑盒测试” : 交换方法 void method_exhangeImplementations( Method m1, Method m2 )
此函数的两个参数表示待交换的两个方法实现,方法的实现:
Method class_get女生探测Method( Class aClass , SEL aSelector )
github:Baoy