黑马程序员-OC语言核心语法(3)(分类、SEL、类本质)

本文详细介绍了Objective-C中的分类、类的本质、类的加载与初始化、description方法及SEL等核心概念。通过实例讲解了如何使用分类为现有类添加新方法,探讨了类对象的获取方式以及对象调用方法的具体过程。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1.分类
   作用:在不修改原来类内容情况下,给某一个类 增加一些方法
   //声明
  @interface 类名(分类名称)  // 分类名称以模块命名
  @end
  //实现
  @implementation 类名(分类名称)
  @end
例如:

@Interface Person(Student) // 声明一个Person 的分类,分类名称是Student
@end
@implementation Person(Student)
@end


 使用注意:
   (1)分类 只能增加方法 ,不能增加成员变量。
   (2)分类方法实现中可以访问原来类中声明的成员变量(主类声明,分类实现)
   (3)分类可以重新实现原来类中的方法,但是会覆盖原来的方法。(覆盖主类中相应方法。)
    (4)优先级: 分类—>原有类—>父类

2. 类的本质: 
  每个类在内存中只要一个类对象,且类对象是由class类型创建的
 (1)类本身也是一个对象,是个Class类型的对象(类对象)。
     类名就代表着类对象,每个类只有一个类对象
     类是由某种类型创造出的一个对像 - > class类型创造出的对象
      eg:针对Person类的解释
      利用Class类 创建Person类对象,然后利用Person类对象创建Person类型的对象(实例对象)
      Class -> Person类对象 -> 具体的实例对象、
      Class类对象->Person类对象->Person类型对象。
 (2)获取类对象的两种方法
     获取类对象:也就是获取类所在内存中的存储空间。
    
  Class c = [Person class] ; // 类方法

     或者
 
  Person *p = [Person new];
  Class c2 = [p class]; // 对象方法,也就是说首先要创建类对象p

 (3)类对象调用类方法
    
 Class c = [Person class]; // 首先获取类对象
 Person *p2 = [c new]; // 然后使用类对象调用内方法

3.类的加载和初始化

 1>类的加载
    加载顺序:父类 -> 子类 
     当程序启动时,就会加载一次项目中所有的类,且类加载完毕后会调用+load方法
      + (void)load; // 程序一启动,就只调用一次此方法,此方法是存在于NSObject

  2>类的初始化
    初始化顺序:父类 -> 子类
     当类第一次使用某个类时,就会调用一次+initialize方法
      + (void)initialize; // 当初始化类时,就会调用此方法,此方法是存在于NSObject
   作用:可用于监控类的初始化(重写类的initialize方法)。

4.description方法(属于NSObject类中,自动调用,不需要人为调用)
 使用NSLog%@输出某个类对象时,会调用此方法输出返回值。
      eg:NSLog(@"%@",p);
作用:更改原有显示在屏幕上的格式。

    -description
        (1)会调用对象p的-description方法
        (2)拿到-description方法的返回值(NSString *) 显示到屏幕上
        (3)此方法默认返回的是"类名:内存地址"  (可通过重写此方法,修改默认值) 
                eg: 
                   
            Person 是类名

   +description  
        (1)默认返回的是“类名”
                  eg:
                       
        (2)使用类调用

5.SEL
    类对象中的每个方法都有一个SEL类型的对象。当第一次调用方法时,会将所有方法从上倒下遍历一次,
当找到我们所需要的方法时,就会根据方法的SEL数据,找到方法地址,最终调用方法,并且将SEL数据缓存。

 SEL概念:SEL是一种对方法的包装。
    将方法包装成一个SEL类型的数据,然后对象根据数据找到对应方法地址,最后根据地址就可以调用相应方法。 
     数据 -> 地址 ->方法

  1> 对象调用方法的具体步骤:
     (1)把方法包装成SEL类型的数据(每个方法都有个对用的SEL数据)
     (2)根据SEL数据找到方法在类中的地址
     (3)根据方法地址调用对应的方法 

 2>  SEL数据的创建
     (1)通过@select将方法转化为SEL数据
    SEL s = @selector(run); // 手工将run方法转化为SEL数据  s
     [p performSelector:s]; // 使用SEL调用run方法


      (2)通过函数将字符串转化为SEL数据

    NSString *name = @"run"; // 通过方法名的字符串转化成SEL,然后再调用此方法
    SEL S1 = NSSelectorFromString(name);
    [p performSelector:S1];


    _cmd 代表着当前方法
       eg: [p performSelector:_cmd]; // 将当前方法转化为SEL数据

6.NSLog输出补充

<pre name="code" class="objc">// 指针变量地址  
NSLog(@"%p",&p);  
// 对象地址  
NSLog(@"%p",p);  
// <类名:对象地址>  
NSLog(@"%@",p); 
 
 

NSLog输出C语言字符的时候 不允许有中文

NSLog(@"%s",str);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值