Objective-C 【self的用法】
———————————————————————————————————————————
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的用法】的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective-C( Foundation框架 一 字符串)
Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...
- iOS开发——新特性OC篇&Objective新特性
Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...
- Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)
Qt/C++开发人员眼中的Obj-C 对于我们第一次自己定义iOS应用来说,对于来自Qt/C++开发人员来说,我不得不学习Objective-C相关语法与知识 为了让读者可以更easy理解这 ...
- KVC的用法
示例1:基本赋值取值 @interface Book : NSObject { NString *name;}@end #import "Book.h"@implement ...
- LightGBM详细用法--机器学习算法--周振洋
LightGBM算法总结 2018年08月21日 18:39:47 Ghost_Hzp 阅读数:2360 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- iOS开发核心语言Objective C —— 全部知识点总结
本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
随机推荐
- oracle 修改用户下部分表现有表空间
工作日记之<修改用户表现有表空间> //user_tables可查询出当前登录用户的所有表,以及部分表信息,可以灵活运用于其他用途 //假设现有表空间TS1.TS2,需要迁移所有表空间TS ...
- After Android Studio update: Gradle DSL method not found: 'runProguard()'
1 具体报错为: Error:(16, 0) Gradle DSL method not found: 'runProguard()' Possible causes:<ul><li ...
- 流弊博客集锦(updating)
1.http://ifeve.com/ 2.淘宝的 code project http://code.taobao.org/ http://blog.csdn.net/tenfyguo/article ...
- Mysql 存储过程、函数、触发器和视图的权限检查
当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将 ...
- dotnetfx35.exe
http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe
- IDispatch接口介绍
1. C程序调用时,调用者必须预先知道接口规范(如,参数类型.参数字节长度.参数顺序等).由于不同语言这些规范有所不同,COM未解决不同语言之间调用,提供了IDispatch接口. 2 ...
- Linux 基础 —— RPM
http://liaoph.com/linux-rpm/ 这篇文章主要讲 RPM 软件包管理器的使用. 软件包的演变史 最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库 ...
- 笨办法学C 练习
http://c.learncodethehardway.org/book/index.html
- 应聘.net开发工程师常见的面试题(一)(转载)
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- 【转】Singleton单例模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...