zoukankan      html  css  js  c++  java
  • OC基础--self关键字

    Self的使用:

      1 self不能离开类   离开类之后没有任何意义

      2 self会自动区分类方法和对象方法

      3 使用self的时候只需要关注self在哪一个方法中

        如果在类方法中使用self   那么self就代表当前类

        如果在对象方法中使用self   那么self就代表"当前调用该方法的对象"

          声明文件.h:  

          #import <Foundation/Foundation.h> 
    
          @interface Phone : NSObject
          {
              // 手机牌子
              NSString* _type;
          }
          /*--------------------------getter-setter方法------------------------*/
          // 属性读写器
          - (void) setType: (NSString *) type;
          - (NSString *) type;
          /*--------------------------对象方法----------------------------------*/
          // 打电话
          - (void) callWithNumber: (NSString *) number;
          // 发短信给
          - (void) sendMessageWithNumber: (NSString *) number andContent: (NSString *) content;
          /*---------------------------类方法----------------------------------*/
          // 警告
          + (void) alert;
          // 关机
          + (void) turnOFF;
          @end 

        实现文件.m:      

          #import "Phone.h" 
    
          @implementation Phone
          /*----------------实现属性读写器-------------------*/
          - (void)setType:(NSString *)type{
              _type = type;
          }
          - (NSString *)type{
              return _type;
          }
          /*----------------实现对象方法--------------------*/
          // self  == 当前调用该方法的对象  == phone
          // 打电话
          - (void)callWithNumber:(NSString *)number{
              // 使用self在对象方法中访问成员变量
              NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number);
          }
          //发短信
          - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{
              NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content);
              // 使用self在对象方法中调用其他对象方法
              [self callWithNumber:number];  
          }
          /*----------------实现类方法----------------------*/
          // self == 当前类 == Phone
          // 警告
          + (void)alert{
              NSLog(@"警告 手机电量不足 请及时充电");
              // 使用self在类方法中调用其他类方法
              [self turnOFF];
          }
          // 关机
          + (void)turnOFF{
              NSLog(@"手机即将关机");
          }
          @end 

        Main.m:

          #import <Foundation/Foundation.h>    
          #import "Phone.h"
          int main(int argc, const char * argv[]) {          Phone * phone = [Phone new];         phone.type = @"iPhone";        [phone sendMessageWithNumber:@"13222334455" andContent:@"对象方法发短信"];        [Phone alert];        return 0;       }       /*        2015-08-30 14:01:23.277 self[509:24866] 用 iPhone 手机给 13222334455 发短信 短信内容: 对象方法发短信        2015-08-30 14:01:23.278 self[509:24866] 用 iPhone 手机给 13222334455 打电话       2015-08-30 14:01:23.278 self[509:24866] 警告 手机电量不足 请及时充电        2015-08-30 14:01:23.278 self[509:24866] 手机即将关机        */

    Self使用注意:

      1 在setter-getter方法中  不能使用self和点语法来对成员属性进行赋值和取值操作   会造成死循环

        /*----------------实现属性读写器-------------------*/
        - (void)setType:(NSString *)type{
            // _type = type;
            //self->_type = type;
            self.type = type;  // 等效于 [self setType: type]  循环调用 setType: 方法
        }
        - (NSString *)type{
            // return _type;
            // return self->_type;
            return self.type;  // 等效于 [self type]; 循环调用 type 方法
        }

      2 在对象方法中调用类方法  会报错  因为self在对象方法中代表的是对象  而类方法需要通过类来调用

        //发短信
        - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{
            NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content);
            // 使用self在对象方法中调用其他对象方法
            [self callWithNumber:number];
            // 错误信息: No visible @interface for 'Phone' declares the selector 'alert'
         [self alert];     }     /*----------------实现类方法----------------------*/     // self == 当前类 == Phone     // 警告     + (void)alert{      NSLog(@"警告 手机电量不足 请及时充电");      // 使用self在类方法中调用其他类方法      [self turnOFF];     }

      3 在类方法中不能调用对象方法或访问成员变量  因为对象方法和成员属性属于对象

        /*----------------实现对象方法--------------------*/
        // self  == 当前调用该方法的对象  == phone
        // 打电话
        - (void)callWithNumber:(NSString *)number{
            // 使用self在对象方法中访问成员变量
            NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number);
        }
        /*----------------实现类方法----------------------*/
        // self == 当前类 == Phone
        // 警告
        + (void)alert{
            NSLog(@"警告 手机电量不足 请及时充电");
            // 使用self在类方法中调用其他类方法
            [self turnOFF];
            // 错误信息: No known class method for selector 'callWithNumber:'
            [self callWithNumber:@"13344552211"];
        }

      4 不能在对象方法或者类方法中利用self调用当前self所在的方法  会造成死循环

        // 打电话
        - (void)callWithNumber:(NSString *)number{
            // 使用self在对象方法中访问成员变量
            NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number);
            [self callWithNumber:number];   // 死循环
        }
        // 关机
        + (void)turnOFF{
            NSLog(@"手机即将关机");
           [self turnOFF];   // 死循环
        } 

     self使用场景:

       > 可以用于在对象方法之间进行相互调用

       > 可以用于在类方法之间进行相互调用

       > 可以用于区分成员变量和局部变量同名的情况

    #import "Phone.h" 
    
    @implementation Phone
    /*----------------实现属性读写器-------------------*/
    - (void)setType:(NSString *)type{
        // _type = type;
        //self->_type = type;
        self.type = type;  // 等效于 [self setType: type]  死循环
    } - (NSString *)type{ // return _type; //return self->_type; return self.type; // 等效于 [self type]; 死循环 } /*----------------实现对象方法--------------------*/ // self == 当前调用该方法的对象 == phone // 打电话 - (void)callWithNumber:(NSString *)number{ // 使用self在对象方法中访问成员变量 NSLog(@"用 %@ 手机给 %@ 打电话", self.type, number); [self callWithNumber:number]; // 调用当前所在方法 死循环 } //发短信 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手机给 %@ 发短信 短信内容: %@", self.type, number, content); // 使用self在对象方法中调用其他对象方法 [self callWithNumber:number]; // 对象方法中调用类方法 错误信息: No visible @interface for 'Phone' declares the selector 'alert' [self alert]; } /*----------------实现类方法----------------------*/ // self == 当前类 == Phone // 警告 + (void)alert{ NSLog(@"警告 手机电量不足 请及时充电"); // 使用self在类方法中调用其他类方法 [self turnOFF]; // 类方法中调用对象方法 错误信息: No known class method for selector 'callWithNumber:' [self callWithNumber:@"13344552211"]; // 类方法中访问成员变量 错误信息: No member named 'type' in 'struct objc_class' NSLog(@"type = %@", self.type); } // 关机 + (void)turnOFF{ NSLog(@"手机即将关机"); [self turnOFF]; // 调用当前所在方法 死循环
    } @end
  • 相关阅读:
    冲刺阶段(三)
    冲刺阶段(二)
    第十一周学习进度
    冲刺阶段(一)
    第十一周学习进度条
    第一阶段——站立会议总结DAY04
    第一阶段——站立会议总结DAY03
    第一阶段——站立会议总结DAY02
    第一阶段——站立会议总结DAY01
    第十周学习进度条
  • 原文地址:https://www.cnblogs.com/dx-230/p/4771861.html
Copyright © 2011-2022 走看看