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:@"" 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关键字的更多相关文章
- OC基础--self关键字&super关键字
PS:OC中的self关键字可以与C#中的this关键字区分记忆,虽然区别还是很大的. OC中的super关键字指的是父类指针 一.self关键字必须了解的知识: 1.使用场合:只能用在方法中(对象方 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- OC基础(1)
Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 *:first-child { margin-top: 0 !important; } body > *:last-chi ...
- OC基础 代理和协议
OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- OC基础13:数字、字符串和集合2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...
- OC基础11:基本的C语言特性2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...
- OC基础10:基本的C语言特性1
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1. 函数和方法的区别? (1).方法包 ...
随机推荐
- spring4+websocket+nginx详细配置
实现的版本jdk1.7.0_25, tomcat7.0.47.0, Tengine/2.1.1 (nginx/1.6.2), servlet3.0, spring4.2.2 使用maven导入版本3. ...
- iOS 消息推送报错NSCocoaErrorDomain Code=3000
转自: http://www.cnblogs.com/zxykit/p/5207498.html Xcode7推送报错.Error Domain=NSCocoaErrorDomain Code=300 ...
- Sa yo na ra
总想记点些什么. 都快忘了当初是为什么来到这里呢... 2014年10月,友人给我介绍了一门编程竞赛ACM,并给我演示了一下A+B.于是我知道了ACM的含义. 2014年12月,开始水入门题. 201 ...
- MFC编程入门之二十三(常用控件:按钮控件的编程实例)
上一节讲了按钮控件Button.Radio Button和Check Box的基本用法,本节继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用. 因为Button控件在前 ...
- webpack 学习笔记
1.html-webpack-plugin 该插件主要作用是在release时,自动向index.html 文件中写入 <script>xx/xx/bundle.js</script ...
- java覆盖重写规则
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开 ...
- [原创] Win7全自动精简批处理_绝对原创,绝对给力_感谢无忧给了我一年的潜水
2011htpcfans发表于 2012-5-5 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=210043 @echo 全自动/手动精简 ...
- 从resfful API设计到加密算法
众所周知,SOAP 是基于XML的webservice协议,传的数据都是xml格式的,而当下resftul设计比较火,因为快效率高,但是安全性就不及SOAP, SOAP定义了xml-security的 ...
- 项目公共js(vue.js)
var urlHead = "http://hm.runorout.com/";// var urlHead = "/";/*加入跑班相关*/var urlGe ...
- SPSS数据分析—生存分析
生存分析是对生存时间进行统计分析的一种技术,所谓生存时间,就是指从某一时间点起到所关心的事件发生的这段时间.这里的时间不一定就是钟表日历上的时间,也有可能是其他的度量单位,比如长度单位等. 生存时间有 ...