———————————————————————————————————————————

self和super关键字



OC提供了两个保留字self和super,用于在方法定义中引用该执行方法的对象。



OC中的self相当于C++、Java中的 this指针 。



super发送消息可以将方法实现分发给其父类(实现父类的方法)





———————————————————————————————————————————

self在对象方法中的使用



举个例子:



#import <Foundation/Foundation.h>



@interface Dog : NSObject

-(void)run;

-(void)eat:(NSString *)foodName;

@end



@implementation Dog

-(void)run

{

    NSLog(@"run!!!");

    //如果我们想在调用run方法的内部调用eat:方法,那么我们可以创建一个新的实例对象,然后调用一下eat:方法。

//    Dog *dog2=[Dog new];

//    [dog2 eat:@"meat"];

    //但是我们知道,这时候调用两个方法的对象并不是同一个了,一个是dog1,一个是dog2。 那么如果我想让同一个实例对象去调用两个方法,该怎么办呢?这时候我们就要用到self关键字了。

    NSLog(@"self的地址:%p",self);//我们输出self的指针值,来查看他的地址

    [self eat:@"meat"];//结果发现,dog1的地址和self的地址是一样的,也就是这两个方法都是同一个实例对象调用的。

//    ★★★所以说self在对象方法中使用时,其指代的是调用当前方法的对象★★★

}

-(void)eat:(NSString *)foodName

{

    NSLog(@"eat %@ now!!!",foodName);

    

}

@end



int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Dog *dog1=[Dog new];

        NSLog(@"dog1的地址:%p",dog1);//同样查看一下dog1的地址

        [dog1 run];

    }

    return 0;

}





———————————————————————————————————————————



self在类方法中的使用



举个例子:



#import <Foundation/Foundation.h>



@interface Dog : NSObject

+(void)run;

+(void)eat;

@end



@implementation Dog

+(void)run

{

    NSLog(@"run!!!");

    NSLog(@"self的地址:%p",self);//在类方法内查看self的当前地址,结果与类的地址是一致的

    //★★★所以说,self在类方法中使用的时候指代的是其当前类★★★

    [self eat];

}

+(void)eat

{

    NSLog(@"eat!!!");

}

@end



int main(int argc, const char * argv[]) {

    @autoreleasepool {

//        NSLog(@"查看Dog类的地址:%p",Dog);  这句话是错误的,显然查看类的地址不能用这种方式。如何去查看,用下面的方式

        

        Dog *dog=[Dog new];

        NSLog(@"Dog类的地址:%p",[dog class]);//[dog class]返回的就是当前类(类对象)的地址。什么是类对象,先不管他。

        

        [Dog run];

    }

    return 0;

}





———————————————————————————————————————————

self 修饰变量



这一部分比较重要,我经过自己的总结做了详细的解释,希望大家好好的去理解,不明白的自己去敲一敲代码,帮助自己吃透这一部分的内容。



举个例子:



#import <Foundation/Foundation.h>



@interface Dog : NSObject

{

//    int _speed;

    int speed;

}

-(void)setSpeed:(int)speed;

-(int)speed;

@end



@implementation Dog



//set方法

//-(void)setSpeed:(int)speed

//{

//    _speed=speed;

//}



//get方法

//-(int)speed

//{

//    return _speed;

//}



//当实例变量名和set方法形参名一样的情况下

-(void)setSpeed:(int)speed

{

//    speed=speed;

//    我们知道实例变量(类的属性成员)是整个类中都可以访问的,所以实例变量是全局变量。而方法的形参是在方法内作用的,所以方法的形参属于局部变量。那么如果在方法的内部定义了与全局变量同名的局部变量,那么局部变量会屏蔽全局变量的作用域。

//    如在上面的一行代码   speed=speed;  我们知道前面的应该是实例变量,后面的是函数传过来的局部变量。但是由于同名,局部变量屏蔽了实例变量的作用域,所以说上面其实是局部变量对局部变量的赋值

    

//    局部变量     局部变量

//    speed   =   speed  ;

    

//    这就如同  int  a = 10 ;

//             a = a ;

    

//    所以说,在同名的情况上,上面的操作是错误的。

    

//    那么我们应该怎么在实例变量名和set方法形参同名的情况下正确为实例变量赋值呢?显然,我们要用到self访问变量。

    self->speed=speed;

}



-(int)speed

{

    return speed;

}



@end



int main(int argc, const char * argv[]) {

    @autoreleasepool {

//        Dog *dog=[Dog new];

//        [dog setSpeed:99];

//        NSLog(@"speed:%d",[dog speed]);

//        上面的这些,都是可以正常运行的。先设置(set)实例变量的值,然后再读取(get)实例变量的值。

//        我们知道,set方法中有一条注意事项就是 一般情况下实例变量名不能和set方法形参名一样。(我们一般在实例变量名前面加下划线,而set方法的形参名是去掉下划线的部分),但是这是指的一般情况下,其实我们是可以让他们一样的,下面我们主要由此来验证self修饰变量的一个用法

        

//        Dog *d=[Dog new];

//        [d setSpeed:90];

//        NSLog(@"speed:%d",[d speed]);

//        对于上面三行的代码,由于实例变量名和set方法的形参同名,所以说产生了错误,所以这里speed的结果是0

        

        Dog *dd=[Dog new];

        [dd setSpeed:88];

        NSLog(@"speed:%d",[dd speed]);

//        上面三行代码,由于正确使用的self去访问变量,所以是正确输出的。

    }

    return 0;

}





———————————————————————————————————————————

self 的总结和注意事项



谁调用当前方法,self就代表谁。



self在对象方法中,self代表当前对象。

self在类方法中,self代表当前类。



同时有 对象方法 和 类方法 存在的时候(且同名),这个时候如果运用self,self也不会调用错误的!self是很聪明的!!!





———————————————————————————————————————————

版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C 【self的用法】的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  3. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

  4. Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

    Qt/C++开发人员眼中的Obj-C      对于我们第一次自己定义iOS应用来说,对于来自Qt/C++开发人员来说,我不得不学习Objective-C相关语法与知识 为了让读者可以更easy理解这 ...

  5. KVC的用法

    示例1:基本赋值取值 @interface Book : NSObject {     NString *name;}@end #import "Book.h"@implement ...

  6. LightGBM详细用法--机器学习算法--周振洋

    LightGBM算法总结 2018年08月21日 18:39:47 Ghost_Hzp 阅读数:2360 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  7. iOS开发核心语言Objective C —— 全部知识点总结

    本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...

  8. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  9. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  10. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

随机推荐

  1. Jquery花园

    1.在线jquery  api:http://hemin.cn/jq/ 2.jquery官网:jquery.com 3.http://www.jqcool.net/ 4.http://www.fron ...

  2. android四大功能组件概要总结

    1.activity  某一个activity对应于app中的一个具体的页面.而intent是具些activity都具有的同类型操作的抽象,比如Main View Edit PICK 已及所对应的数据 ...

  3. CSS背景与列表

    CSS中背景的使用 CSS中列表的使用 15.1 CSS中背景的使用         属性名称                             属性值                      ...

  4. 转载 : Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结 投稿:jingxian 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文是 ...

  5. 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

    原文地址:http://www.ibm.com/developerworks/cn/web/wa-restful/ 简介: Spring,构建 Java™ 平台和 Enterprise Edition ...

  6. 【转】linux中的cut/tr/join/split/xargs命令

    1. cut命令 cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出. 截取的方式有三种:一是按照字符位置,二是按照字节位置,三是使用一个分隔符将一行分割成多个field, ...

  7. Nginx+tomcat 做负载均衡

    架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat) 优点:实现了可弹性化的架构,在压力 ...

  8. [AngularJS] 'require' prop in Directive or Component

    When use 'require', recommend to add some error check, for example: class ChildCtrl { constructor(){ ...

  9. SharePoint 2013+ Sqlserver 2014 Kerberos 配置传奇, 最终的解决方案 验证。

    SharePoint 2013+ Sqlserver 2014 Kerberos 配置传奇. 1,安装数据库,我就不多说安装,客户一定要注意. 我将参照以下实施例和账户. 2,建立DNS,假设没有DN ...

  10. 学习笔记之Python

    http://baike.baidu.com/view/21087.htm?fr=aladdin#reference-[12]-21087-wrap Python 基础教程(http://www.w3 ...