首页 > 代码库 > 《OC疯狂讲义》笔记(四)

《OC疯狂讲义》笔记(四)

1、两个关键字:self 和 super
 
    self 可以用在对象和类方法中
 
    1)self用在对象方法中:指代的时调用当前对象方法的那个对象
    2)self用在类方法中:指代的时当前类(实质是类对象)
 
    总结:当self在方法中使用,谁调用这个方法,self指代的就是谁
 
    super:
   
    使用super的地方,一定存在继承关系
 
    super调用父类的方法


 2、面向对象的其他特性:继承
 
    继承概念:
    假设有两个类:A   B
    继承是两个类之间的关系
 
    假设声明B类的时候,
 
    1)导入父类的头文件
    2)设定继承关系
    @interface B : A     ----> B类继承了A类
 
    @end


    关于继承注意事项:
 
    1)单一继承(一个类只能继承另外一个类)
    2)OC支持多层继承(Animal <-----Dog <------BigYellowDog)
    3) 子类可以继承父类的非私有的属性和方法
       使用@private 修饰的成员变量 可以被子类继承,但是不能访问
    4)子类可以直接使用从父类继承过来的属性和方法
       子类可以调用子类的方法,也可以调用从父类的方法
       子类可以使用super调用父类的方法
 
    5)父类只能调用父类自己的方法
    6)子类可以定义和父类同名的方法(方法的重写)
    7)子类不能定义和父类同名的变量
    8)方法的执行的顺序:先执行子类的--->找父类--->父。。。-->NSObject-->报错
 
 3、成员变量修饰符的使用


    成员变量修饰符有4个
    @public   共有的,作用域:在任何类中都可以通过对象使用成员变量
    @protected 受保护的,默认修饰,作用域:只能在当前类或者子类中使用
    @private  私有的,作用域:只能在本类(本文件)使用,可以被子类继承,但是不能在子类中使用
    @package  框架级别,只能在框架中使用
 
 4、私有方法
 
    私有方法的实现:
   
    1)通过类别
 
    2)常见的书写私有方法
 
       定义:.m中定义一个方法,但是没有.h中声明,那这个时候,该方法就是一个私有方法(不是真正的私有,只是被隐藏了)
    
       调用:在类中 [self  私有方法名];
 
    3)私有的变量
 
       定义:.m中声明的变量,是不能被继承的


 5、description 使用
  
    descriptioin 方法,在我们每次以%@的形式打印对象的时候, 会默认调用的方法
 
    方法有两个:
    
    1)-(NSString *)description;
 
       对象方法:
       
       Person *p = [Person new];
 
       NSLog(@"%@",p);   //会调用 description 对象方法
 
      description应用场景:
   
       在子类中重写该方法,输出该对象的成员变量值。
 
       -(NSString *)description{
 
            return [NSString stringWithFormat:@"age=%d,name=%@",_age,_name];
      }
 
       NSLog(@"%@",p); //  age=18,name=zhangsan
 
 
   2)+(NSStiring *)description{


     }
     // [p class]----->Person(类对象)
 
     NSLog(@"%@",[p class]);
 
 
 6、面向对象特性:多态
 
    多态的概念:
 
         不同的对象以自己的方式响应父类的一个方法
 
    多态的前提:
 
         1)要有继承关系
 
         2)要有同名方法
  
         3)要存在方法的重写
 
   多态的核心:
 
         用父类的指针指向子类的对象
 
         Animal *ani = [Dog new];
 
         [ani run];  // dog run
 
   多态的注意点:
 
        1)如果存在多态,父类是可以访问子类特有的方法
 
           假设 子类 Dog 有一个特有的方法bark
 
           [dog bark];
 
           Animal *an2 = [Dog new];
 
           [(Dog*)an2 bark];   //把父类的指针,强制类型转换
 
        2)如果不存在多态,父类是不可以访问子类特有的方法的
 
           Animal *an3 = [Animal new];
 
           [(Dog*)an3 bark];  //错误的,不能强制转换
 
 
 7、类的本质(了解)
 
         类的本质也是一个类类型
 
         Person *p = [Person new];   //p是一个实例对象,p是Person类型
 
         Person 实质也是一个对象,又称为 类对象
   
         类对象应该有类型,是Class类型的
  
         获取类对象的方法: 
 
               1)Class c1 = [Person class];
 
                        c1 就是 Person 类对象
 
               2)Class c2 = [p class];
 
         SEL 是一种类型
 
             选择器类型: 可以把一个方法包装成此类型
 
         通过SEL类型,可以找到 在代码区的方法的地址
 
             SEL s1 =@selector(eat);  //把eat方法,包装成SEL类型了

《OC疯狂讲义》笔记(四)