首页 > 学院 > 开发设计 > 正文

OC基础--self关键字

2019-11-14 18:25:33
字体:
来源:转载
供稿:网友

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表