zoukankan      html  css  js  c++  java
  • Objective

    前面我们学了self的基本使用, 现在我们来看看self的注意事项~~


    1.死循环

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)test;
    + (void)test;
    @end
    
    @implementation Preson
    - (void)test
    {
        NSLog(@"调用了实例方法.");
        [self test];  //死循环
    }
    
    + (void)test
    {
        NSLog(@"调用了类方法.");
        [self test];  //死循环
    }
    @end
    
    int main()
    {
        Preson *p = [Preson new];
        [p test];
        
        
        [Preson test];
        return 0;
    }

    如果像上面这样子的调用方法, 那必然会造成死循环, 其实这里面的和我们之前讲类方法的时候一样, 自己调用自己, 就会造成无线循环.



    2. 小心调用时候的陷阱.

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)test;
    + (void)test;
    
    - (void)test1;
    + (void)test2;
    @end
    
    @implementation Preson
    - (void)test
    {
        NSLog(@"调用了实例方法.");
    }
    
    + (void)test
    {
        NSLog(@"调用了类方法.");
    }
    
    - (void)test1
    {
        [self test];
    }
    
    + (void)test2
    {
        [self test];
    }
    
    @end
    
    int main()
    {
        Preson *p = [Preson new];
        [p test];
        
        
        [Preson test];
        return 0;
    }

    输出的结果是:

    2015-01-18 10:36:28.374 a.out[16527:1789113] 调用了实例方法.
    


    使用self的时候, 它对根据你的调用者是类, 就去调用相应的类方法, 是对象, 就会调用相应的实例方法, 并不会随便乱调用.



    3. 调用方法时要注意类型

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)test1;
    + (void)test2;
    @end
    
    @implementation Preson
    - (void)test1
    {
        NSLog(@"哈哈哈哈哈");
    }
    
    + (void)test2
    {
        [self test1];
    }
    
    @end
    
    int main()
    {
        [Preson test2];
        
        return 0;
    }

    编译链接:

    Cain:2.第二天 Cain$ cc 09-self的注意事项.m -framework Foundation
    09-self的注意事项.m:16:11: warning: class method '+test1' not found
          (return type defaults to 'id'); did you mean '+test2'? [-Wobjc-method-access]
        [self test1];
              ^~~~~
              test2
    1 warning generated.

    编译链接时并不会报错, 只会有一个小警告, 运行时:

    2015-01-18 10:45:39.698 a.out[16551:1792006] +[Preson test1]: unrecognized selector sent to class 0x10d806160
    

    这个报错和我们之前的报错是一样的, 没有找到对应的test1的类方法, 所以在使用self的时候, 要注意调用的方法是否符合类型.


    下面这个也是如此:

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)test1;
    + (void)test2;
    @end
    
    @implementation Preson
    - (void)test1
    {
        NSLog(@"哈哈哈哈哈");
    }
    
    void test3()
    {
        
    }
    
    + (void)test2
    {
        [self test3];
    }
    
    @end
    
    int main()
    {
        [Preson test2];
        
        return 0;
    }

    这样子也是不行的, 调用函数的时候, 不能使用self调用.




    补充一下:

     self的用途:

     1> 谁调用了当前方法,self就代表谁

     * self出现在对象方法中,self就代表对象

     * self出现在类方法中,self就代表类

     

     2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量

     

     3> [self 方法名]可以调用其他对象方法类方法





    好了, 这次我们就到这里, 下次我们继续~~~

  • 相关阅读:
    【转载】八大排序算法
    【转载】算法的时间复杂度和空间复杂度的计算
    【转载】SpringMVC前台给后台传值的方式
    Session方法
    配置《算法 第四版》的Eclipse开发环境
    Learning Scrapy笔记(三)- Scrapy基础
    Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫
    Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面
    Scrapy Learning笔记(四)- Scrapy双向爬取
    Learning Scrapy笔记(五)- Scrapy登录网站
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282850.html
Copyright © 2011-2022 走看看