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).方法包 ...
随机推荐
- 防止SQL注入的方法
方法1⃣️addslashes(); $username=addslashes($_POST['username']); 方法2⃣️mysql_escape_string(); 方法3⃣️开启魔术引号 ...
- Example For maven-compiler-plugin
1. Compiling Sources Using A Different JDK The compilerVersion parameter can be used to specify the ...
- Deep Learning 26:读论文“Maxout Networks”——ICML 2013
论文Maxout Networks实际上非常简单,只是发现一种新的激活函数(叫maxout)而已,跟relu有点类似,relu使用的max(x,0)是对每个通道的特征图的每一个单元执行的与0比较最大化 ...
- centos 开机启动服务
一.启动脚本 /etc/rc.local 启动 最简单的一种方式,在启动脚本 /etc/rc.local (其实 /etc/rc.local 是/etc/rc.d/rc.local 的软链接文件,实际 ...
- C# 拆箱与装箱 要严格控制,数量多起来严重影响效率
int i = 5; object o = i; int j = (int)o; IComparer x = 5; 1. o的对象必须为一个引用,而数字5不是,则发生了装箱: 运行时将在堆上创建一个包 ...
- MAC usb启动盘制作
1.从App Store 下载OS 2.磁盘工具格式化磁盘默认即可 3. 为啥截图,因为有些是不一样的,建议使用 Tab建, 未命名则是你移动U盘命名的名称. 4.完成:所有的命令完成的话, 终 ...
- (45) Manifest文件
这个是一模块主要描述和设置的文件,下面进行讲解一下{ 'name': "A Module", 'version': '1.0', 'depends': ['bas ...
- Git代码管理常用命令
1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git查看远程仓库:$ git remote -v添加远程仓库:$ git re ...
- C# DateTime 格式化 奇怪问题!
使用 DateTime.Now.ToString("MM/dd") 本地显示 06/16 window sevcie 2003 显示是 06-16 解决方法: DateTime. ...
- rpm 软件安装
安装 vi 软件 rpm q查询 a全部软件 e 卸载 i 安装 v 显示进度 h 以#显示 首先确定软件时候安装 rpm 实现软件的安装 卸载 升级 查询等 1)查询是否已经安装过 rpm -qa ...