美文网首页
读Effective objective-c 2.0

读Effective objective-c 2.0

作者: Amy莫莫 | 来源:发表于2018-01-05 22:37 被阅读9次

第1条:oc起源

  • oc是给c添加面向对象特性,是其超集

  • oc使用动态绑定的消息结构,运行期所执行代码由运行环境决定,非编译器决定。函数调用由编译器决定。

  • oc指针用来指示对象。

    NSString* someString=@"the string"  此变量为指向NSString的指针
    
  • 对象所占内存分配在堆上,oc的内存管理是指对堆空间的内存管理。不带*号的变量,不是对象,保存在栈上(基本数据类型)。

     CoreGraphics中的CGRect,CGRect是C结构体。
      struct  CGRect{
        CGPoint origin;
        CGSize size;
       };
       typedef struct CGRect CGRect;
    

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

  • @class引用,避免循环引用

      #import <Foundation/Foundation.h>
      @class EOCEmployer;
      @interface Employee : NSObject
      @property(nonatomic,copy)NSString *name;
      @property(nonatomic,strong)EOCEmployer *employer;
      @end
    

第3条:多用字面量语法,少用与之等价的方法

  • 字面数值

      //非字面量创建
      NSNumber *num=[NSNumber numberWithInt:1];
      //字面量创建
      NSNumber *intNum=@1;
      NSNumber *boolNum=@YES;
      NSNumber *charNum=@'a';
      int x=5;
      float y=5.67;
      NSNumber *totoalNum=@(x*y);
    
  • 字面量数组

    //非字面量
    NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];
    NSString *one=[array objectAtIndex:1];
    //字面量
    NSArray *array=@[@"1",@"2",@"3",@"4"];
    NSString *one= array[1];
    
  • 字面量字典

    //非字面量
    NSDictionary *person=[NSDictionary dictionaryWithObjectsAndKeys:@"Mat",@"name",[NSNumber numberWithInt:20],@"age", nil];
    NSString *name=[person objectForKey:@"name"];
    //字面量
    NSDictionary *person=@{@"name":@"Mat",@"age":@28};
    NSString *name=person[@"name"];
    
  • 可变数组与字典

  NSMutableArray *mutableArray=[array mutableCopy];
   //非字面量 
  [mutableArray replaceObjectAtIndex:1 withObject:@"a"];
   //字面量
  mutableArray[1]=@"a";


NSMutableDictionary *mutableDic=[person mutableCopy];
 //非字面量 
[mutableDic setObject:@"MO" forKey:@"name"];
 //字面量
mutableDic[@"name"]=@"MO";

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

  • 不要用#define定义常量,这样定义出来的常量不含类型信息。

  • 使用static const 定义“只在编译单元内可见的常量”,此类常量不在全局符号表中,无需加前缀。

  • 在头文件中使用extern来声明全局常量,需要加前缀。

    static const NSTimeInterval kAnimationDuration=0.3;
    
    在头文件中 extern NSString *const kAnimationDuration;
    

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

第6条:理解“属性”

  • 点语法就是对存取方法的调用
  • @dynamic关键字,告诉编译器不要自动创建实例变量和存取方法
  • 特性:atomic(原子性)、nonatomic、readwrite、readonly、assign(纯量类型:基本数据类型、NSInteger、CGFloat等)、strong(拥有关系:保留新值,释放旧值,再设新值)、weak(非拥有关系:不设置新值、不释放旧值,对象释放就清空)、unsafe_unretained(语义与assign相同,适用于对象类型,非拥有关系,对象摧毁时,属性值不会自动清空)、copy、getter=<name>、setter=<name>

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

  • 直接访问实例变量会比点语法的速度快,因为不经过方法派发。
  • 直接访问实例变量,不会调用其设置方法,绕过了内存管理。
  • 直接访问实例变量,不会触发KVO。
  • 通过属性访问有助于排查与之相关的错误,因为可以在存取方法里设置断点,监控属性的调用者和时机。
  • 读取时用实例变量读,写入时用属性来写。
  • 懒加载是在get方法里对对象进行初始化,必须用点语法访问属性。

第8条:理解“对象等同性”

  • ==比较的是两个指针本身,并不是对象。NSObject用isEqual和hash方法判断两个对象是否相等。
  • 相同的对象必须具有相同的hash码,但hash码相同的两个对象未必相同。
  • hash是对象等同性的必要非充分条件,在NSSet和NSDictionary中判断时,会先判断hash值是否相等,如果相等,那么就会进行isEqual的判断;反之,不相等,直接判断对象不相等

第9条:以“类族模式”隐藏实现细节

  • 类族模式可以把实现细节隐藏在一套公共接口后面

第10条:在既有类中使用关联对象存放自定义数据

相关文章

网友评论

      本文标题:读Effective objective-c 2.0

      本文链接:https://www.haomeiwen.com/subject/oxosnxtx.html