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. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...

  2. 搞清css的单位 px,em,rem的区别

    前言:现在上大街一眼望去,基本上90%的人都拿着手机,走路,逛街,吃东西都不停着,所以对于我们这种前端开发的程序猿来说,让网页适应于移动端可以说是必须要满足的.所以最近也是一直在学习和实践.然后就接触 ...

  3. jq 实现上下排序的一段代码

    前台页面: <div class="adddaren_box"> {%if isset($masterDetailsInfo)%} <div class=&quo ...

  4. HTTP协议的报文结构

    HTTP 有两类报文: (1) 请求报文----从客户向服务器发送请求报文,见图6-12(a). (2) 响应报文----从服务器到客户的回答,见图6-12(b). 由于 HTTP是面向文本的(tex ...

  5. shell中$0,$?,$!等变量意义

    变量说明:   $$     #Shell本身的PID(ProcessID) $!     #Shell最后运行的后台Process的PID $?     #最后运行的命令的结束代码(返回值) $- ...

  6. 把excel导入的自定义时间改成yyyyMMdd

    public static String changeCellToString(XSSFCell cell){ String result = "";// Object value ...

  7. 使用Asp.Net Core Identity给用户添加及删除角色

    基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager. 先后解决了几个问题,终于实现了设想. 1. 环境条件 Asp.Net ...

  8. <css篇>关于页面的绝对定位与相对定位,且支持页面各元素自适应

    (哈哈,第一次写博客,简称处贴?主要记录下平时工作中遇到的问题及其解决方案,方便以后解决此类问题.) 话不多说,上代码看吧 代码有点乱,以后自己能看得懂就行咯 <body > <di ...

  9. SPSS数据分析—Probit回归模型

    Probit含义为概率单位,和Logistic回归一样,Probit回归也用于因变量为分类变量的情况,通常情况下,两种回归方法的结果非常接近,但是由于Probit回归的结果解释起来比较抽象不易理解,因 ...

  10. 【JAVA】【leetcode】【使用堆栈实现后向计算】

    题目:evaluate-reverse-polish-notation 要求: Evaluate the value of an arithmetic expression in Reverse Po ...