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:@"" andContent:@"对象方法发短信"];
       [Phone alert];
       return ;
      }
      /*
       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:@""];
    }

  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:@""];
// 类方法中访问成员变量 错误信息: No member named 'type' in 'struct objc_class'
NSLog(@"type = %@", self.type);
}
// 关机
+ (void)turnOFF{
NSLog(@"手机即将关机");
[self turnOFF]; // 调用当前所在方法 死循环
}
@end

OC基础--self关键字的更多相关文章

  1. OC基础--self关键字&super关键字

    PS:OC中的self关键字可以与C#中的this关键字区分记忆,虽然区别还是很大的. OC中的super关键字指的是父类指针 一.self关键字必须了解的知识: 1.使用场合:只能用在方法中(对象方 ...

  2. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  3. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  4. OC基础(1)

    Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 *:first-child { margin-top: 0 !important; } body > *:last-chi ...

  5. OC基础 代理和协议

    OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...

  6. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  7. OC基础13:数字、字符串和集合2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...

  8. OC基础11:基本的C语言特性2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...

  9. OC基础10:基本的C语言特性1

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.  函数和方法的区别? (1).方法包 ...

随机推荐

  1. spring4+websocket+nginx详细配置

    实现的版本jdk1.7.0_25, tomcat7.0.47.0, Tengine/2.1.1 (nginx/1.6.2), servlet3.0, spring4.2.2 使用maven导入版本3. ...

  2. iOS 消息推送报错NSCocoaErrorDomain Code=3000

    转自: http://www.cnblogs.com/zxykit/p/5207498.html Xcode7推送报错.Error Domain=NSCocoaErrorDomain Code=300 ...

  3. Sa yo na ra

    总想记点些什么. 都快忘了当初是为什么来到这里呢... 2014年10月,友人给我介绍了一门编程竞赛ACM,并给我演示了一下A+B.于是我知道了ACM的含义. 2014年12月,开始水入门题. 201 ...

  4. MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节讲了按钮控件Button.Radio Button和Check Box的基本用法,本节继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用. 因为Button控件在前 ...

  5. webpack 学习笔记

    1.html-webpack-plugin 该插件主要作用是在release时,自动向index.html 文件中写入 <script>xx/xx/bundle.js</script ...

  6. java覆盖重写规则

    重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开 ...

  7. [原创] Win7全自动精简批处理_绝对原创,绝对给力_感谢无忧给了我一年的潜水

    2011htpcfans发表于 2012-5-5 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=210043 @echo 全自动/手动精简 ...

  8. 从resfful API设计到加密算法

    众所周知,SOAP 是基于XML的webservice协议,传的数据都是xml格式的,而当下resftul设计比较火,因为快效率高,但是安全性就不及SOAP, SOAP定义了xml-security的 ...

  9. 项目公共js(vue.js)

    var urlHead = "http://hm.runorout.com/";// var urlHead = "/";/*加入跑班相关*/var urlGe ...

  10. SPSS数据分析—生存分析

    生存分析是对生存时间进行统计分析的一种技术,所谓生存时间,就是指从某一时间点起到所关心的事件发生的这段时间.这里的时间不一定就是钟表日历上的时间,也有可能是其他的度量单位,比如长度单位等. 生存时间有 ...