zoukankan      html  css  js  c++  java
  • Objective

    在前面我们知道了实例方法, 类方法, set方法, get方法, 现在我们来讲一个和OC普通关键字(因为OC的关键字都带"@"符号)不一样的self, 那什么是self呢??? 下面让我们一起来看看~~


    先看一个例子:

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    {
        int _age;
    }
    - (void)setAge:(int)age;
    - (int)age;
    
    - (void)test;
    @end
    
    @implementation Preson
    - (void)setAge:(int)age
    {
        _age = age;
    }
    - (int)age
    {
        return _age;
    }
    
    - (void)test
    {
        NSLog(@"有一个%d岁在人在等车", _age);
    }
    @end
    
    int main()
    {
        Preson *p = [Preson new];
        
        [p setAge:20];
        
        [p test];
        
        return 0;
    }

    输出的结果我们都知道:

    Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 21:39:35.977 a.out[15770:1718617] 有一个20岁在人在等车


    那如果改一下test方法呢???

    - (void)test
    {
        int _age = 30;
        NSLog(@"有一个%d岁在人在等车", _age);
    }

    输出的结果:

    Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
    07-self.m:26:45: warning: local declaration of '_age' hides instance variable [-Wshadow-ivar]
        NSLog(@"有一个%d岁在人在等车", _age);
                                       ^
    1 warning generated.
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 21:47:24.067 a.out[15783:1720419] 有一个30岁在人在等车


    虽然有警告, 但并不影响我们运行, 为什么会有这样子的结果呢? 不是设定的值是20么~~


    其实这个和我们之前在C语言里面学过的一样, 就近原则, 一旦在比较近的同名实例变量, 就只会找最近的, 只有在里面没有同名的实例变量, 才会出去找.




    那如果我只想访问main()函数里面的那个值, 不想要就近原则呢? 解决办法是有的, 让我们来看看~~

    1. 使用第三方变量

    - (void)test
    {
        int newAge = _age;
        int _age = 30;
        NSLog(@"有一个%d岁在人在等车", newAge);
    }
    

    在修改之前把原来的值取出来, 赋给另外一个变量, 再打印出来, 结果就和我们想的一样:

    Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 21:51:02.652 a.out[15792:1721365] 有一个20岁在人在等车
    



    2. 使用self关键字

    - (void)test
    {
        int _age = 30;
        NSLog(@"有一个%d岁在人在等车", self->_age);
    }
    

    输出的结果也和我们想要的是一致:

    Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 21:52:54.949 a.out[15799:1722160] 有一个20岁在人在等车




    那么self到底是什么呢? 


    其实self是一个指针, 那么这个指针指的是谁呢? 在main()函数里, 谁调用, 那么self就指谁, 在我们这个例子里, 是p在调用test方法, 那么self就是指向p啦~~所以打印出来的结果和我们想要的是一致.




    那么self除了这样子用, 还有没有其他用途呢? 其实是有的, 比如:

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)eat;
    - (void)run;
    @end
    
    @implementation Preson
    - (void)eat
    {
        NSLog(@"一个人在吃东西.");
    }
    - (void)run
    {
        NSLog(@"一个人在跑步.");
    }
    @end
    
    int main()
    {
        Preson *p = [Preson new];
        
        [p eat];
        [p run];
        
        return 0;
    }

    在之前, 我们如果要调用两个方法, 就必须这样子去调用, 但现在我们学了self, 那么就可以很省事了~~

    #import <Foundation/Foundation.h>
    
    @interface Preson : NSObject
    - (void)eat;
    - (void)run;
    @end
    
    @implementation Preson
    - (void)eat
    {
        NSLog(@"一个人在吃东西.");
    }
    - (void)run
    {
        [self eat];
        NSLog(@"一个人在跑步.");
    }
    @end
    
    int main()
    {
        Preson *p = [Preson new];
        
        [p run];
        
        return 0;
    }

    输出的结果:

    Cain:2.第二天 Cain$ cc 08-self.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 22:37:55.563 a.out[15910:1731906] 一个人在吃东西.
    2015-01-17 22:37:55.565 a.out[15910:1731906] 一个人在跑步.

    非常的简单, 我们就可以省略很多事情, 直接调用一个方法就可以了~~~





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

  • 相关阅读:
    windows 1061
    Golang 编程思维和工程实战
    Apache Tomcat jar Catalina
    MySQL Client/Server Protocol mysql协议
    蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路
    实习生系列之找实习的途径
    Yahoo!网站性能最佳体验的34条黄金守则
    onselectstart="return false"无法复制文字
    VS2008开发环境中容易遇到的3个问题之解决办法
    实践与交流:“三保险”为世界顶级安全防范软件ESET Nod32 4.0的正常使用“保驾护航”
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282851.html
Copyright © 2011-2022 走看看