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
时间: 2024-10-13 01:15:19

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

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

iOS开发OC基础:OC基础概念总结,OC面向对象的思想

一.什么是OOP: OOP(Object Oriented Programming):面向对象编程 二.面向对象和面向过程的区别: 面向过程编程:分析解决问题的步骤,实现函数,依次使用面向对象编程:分解问题组成的对象,协调对象间的联系和通信,解决问题. 面向过程是以事件为中心,关心的是完成这个事件的详细步骤:面向对象是以事物为中心,关心的是事物应该具备的功能,而完成一个事件只是事物所有功能里面的一个小功能(以过程为中心,以对象为中心) 三.类和对象 对象定义了解决问题的步骤中的行为,不刻意完成一

iOS开发OC基础:OC属性的一些概念和基本使用

一.属性简介 //属性是OC2.0之后新出的一种语法,能让我们快速的生成setter以及getter方法,大大简化代码 二.如何定义一个属性 //@property 属性关键字,用来定义属性 //NSString * 属性的类型 //name 属性的名字. //@property 只是生成的setter以及getter方法的声明.@property NSString *name; 三.属性的使用注意事项//如果在.m文件中我们自己实现了setter以及getter方法,则编译器就不会再帮我们生成

OC基础 代理和协议

OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议-->调用协议. (3)协议声明的关键字: (a)@required,必须实现,不实现的话在.m文件内会报警告. (b)@optional,可选实现,不实现的话在.m文件内也不会报警告. (4)协议和继承的区别: (a)相同之处:都可以规范统一类中的方法. (b)不同之处:继承的子类不需要再实现一遍父类

oc基础第一天---c语言和oc语言的对比

/* 1. OC程序的编译. 它的编译.连接.执行和C程序是相差无几的. 1). 在.m文件中写上符合OC语法规范的源代码. 2). 使用 cc -c 指令来编译我们的文件. a. 预处理. b. 检查语法 c. 生成.o的目标文件. 3). 链接 cc xx.o a. 添加启动代码. b. 链接函数. 将要调用的函数的实现拷贝进来 在代码中如果使用到了框架中的功能  就必须要指定系统到那1个框架中去找. cc main.o -framework Foundation 4). 链接完毕之后 会生

oc基础知识(转)

1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouch Media Core Services Core OS -------------------- System Framework OC的类声明,定义域 OC关键字定义为  @class O-C特有的语句for(..in ..)迭代循环,其他的条件和循环语句和c一样 OC对面向对象的概述 (1)

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

OC基础-protocol

protocol(协议)的声明看起来比较向java中得一个类的接口,但是不同点在于:protocol没有父类也不能定义实例变量. protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法. 常见使用场合: 1.需要由别的类来实现的方法 2.声明未知类的接口 3.两个类之间的通信 protocol的基本特点: 协议可以被任何类实现的方法 协议本身不是类,他是定义了一个其他类可以实现的接口. 类别也可以采用协议(用得不多) protocol中得关键字: @required :表示必须

一.oc基础

 如何构建一个oc客户端程序 1. oc 第一个程序 2. oc 的数据类型 3. oc 的书写规范 4. oc 的格式符 1.如何构建一个oc客户端程序? 开Xcode,选择Create a new Xcode project 点击左边的OS X ->Command Line Tool 控制行工具 ProductName:项目名称 OrganizationName:组织名称 Organization Identifier: 组织标示 (一般将公司域名倒过来写) Language:使用的开发语言