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. List中存储同一个对象(内容不同)

    List中存储同一个对象,前面的会被后存入的对象覆盖,解决方法:每次存入新的对象

  2. ASP.NET MVC: Razor中的@:和语法

    本文将讨论新版Razor里视图引擎中支持的两个有用的语法功能:@:和<text>语法. 用Razor实现流畅编程 ASP.NET MVC 3配有一个新的名为“Razor”的视图引擎选项(除 ...

  3. Lambda表达式入门

    Lambda表达式是Java 8的重要更新,也是一个被广大开发者期待已久的新特性,Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接 ...

  4. python3 密码生成器

    用random模块实现按照要求生成一定个数和一定位数的密码: #Author by Andy #_*_ coding:utf-8 _*_ import random checkcode='' code ...

  5. C# GDI+发生一般性错误(A generic error occurred in GDI+))

    解决思路: 1. 因为 .net GDI+ 是对底层 的封装. 所以可以尝试用 Marshal.GetLastWin32Error();函数获得底层错误代码. try{ image.Save(file ...

  6. MySQL DML 整理

    DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects. 由D ...

  7. windows server 2003(64位)上利用iis6部署32位应用

    如果直接部署,会出现如下问题: 试图加载格式不正确的程序. (Exception from HRESULT: 0x8007000B) 解决办法 1.命令行键入: cscript.exe %SYSTEM ...

  8. 用python爬取QQ空间

    好久没写博文了,最近捣鼓了一下python,好像有点上瘾了,感觉python比js厉害好多,但是接触不久,只看了<[大家网]Python基础教程(第2版)[www.TopSage.com]> ...

  9. 图表,列表在同一DIV里切换显示()

    JS: function changeTable(){ $(".countTable").slideDown(); $(".countChart").css(& ...

  10. 基础算法之插入排序Insertion Sort

    原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元 ...