zoukankan      html  css  js  c++  java
  • Objective-C( 语法二)

     分类(Category):可以给某一个类扩充一些方法(不修改原来类的代码)

     作用:在不改变原来类内容基础上,可以为类增加一些方法

     

     使用注意

       1. 只能增加方法,不能增加成员变量

       2. 分类方法实现中可以访问原来类中的成员变量

       3. 分类可以重新实现原来类中的方法,会覆盖原来类的方法,导致原来类的方法无法再使用

       4. 分类的优先级最高:调用一个方法优先去分类中找,再去原来类,然后父类中找

      分类(最后编译的优先)—》原来类—》父类

      声明:

     @interface 类名(分类名称)

     @end

      实现:

     @implementation 类名

     @end

     

    类的本质

    类本身也是一个对象,是Class类型的对象,简称类对象

    Class类型的定义

    typedef struct objc class *Class

    类名代表着类对象,每个类只有一个类对象

     

    +load方法和+initialize方法:

    1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。

    2.当第一次使用某个类时,就会调用当前类的+initialize方法,一个类只会调用一次+initialize方法

    3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

       先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法

    description方法

    使用NSLog输出属性较多时,修改默认输出,可重写+description方法或-desription方法

    +description方法:

    默认情况下,使用NSLog和%@输出对象时,调用对象的-desription方法,拿到的返回值(NSString *)屏幕输出结果是:<类名:内存地址>

    +desription方法:

    默认情况下,使用NSLog和%@输出类对象时,调用类对象的+desription方法,拿到的返回值(NSString *)屏幕输出

    注意点:

    不要在-desription方法中尝试使用self,会造成死循环

    NSLog打印

    1. %p

       打印指针变量p的地址  

      NSLog(@"%p", &p);

        打印对象地址

          NSLog(@"%p", p);

    2. %@

      %@ 打印<类名:对象地址> 

      NSLog(@"%@", p);

    3.  _LINE_     %d    输出当前行号

    4.  _FILE_      %s    输出文件路径

    5.  _func_      %s    输出当前函数

    SEL

    全称selector

    SEL 其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法

    _cmd 代表当前方法

    消息就是SEL

    #import <Foundation/Foundation.h>
    
    
    @interface Person : NSObject
    
    + (void)test;
    
    - (void)test1;
    - (void)test2:(NSString *)abc;
    
    @end
    
    @implementation Person
    + (void)test
    {
        NSLog(@"+test+++++++");
    
    }
    
    - (void)test1
    {
        NSLog(@"-test-------");
    }
    
    - (void)test2:(NSString *)abc
    {
        NSLog(@"test2----%@", abc);
    
    }
    @end
    
    
    int main()
    {
        Person *p = [[Person alloc] init];
        
        NSString *name = @"test1";
        SEL s = NSSelectorFromString(name);
        
        [p performSelector:s];
        
        // [Person test];
        // [p test1];
        // 1.把test1包装成SEL类型的数据
        // 2.根据SEL数据找到对应的方法地址
        // 3.根据方法地址调用对应的方法
        
        // 间接调用test1
        // [p performSelector:@selector(test1)];
        // [p performSelector:@selector(test2:) withObject:@"123"];
    
        return 0;
    }
  • 相关阅读:
    artZoom 图片可放大旋转
    Node.js究竟是什么?
    图片上传 纯js编码
    图片上传jQuery插件(兼容IE8)
    nodejs API(二)
    zuul网关
    Hystrix集群及集群监控turbine
    熔断器Hystrix及服务监控Dashboard
    Ribbon负载均衡及Feign消费者调用服务
    Eureka集群
  • 原文地址:https://www.cnblogs.com/1023843587qq/p/4751099.html
Copyright © 2011-2022 走看看