OC基础--self关键字
2024-09-29 20:36:02
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
最新文章
- [函数] Delphi FMX Windows 取得下载 Downloads 目录
- Intellij IDEA IDE部署Servlet项目
- Android Retrofit实现原理分析
- 现代程序设计 homework-08
- Weex命令
- Python之练习Demo
- 简单的访客IP获取类-IPHelper.cs
- (原)torch中显示nn.Sequential()网络的详细情况
- Netty对WebSocket的支持(五)
- Mysql利用存储过程插入400W条数据
- 挖一挖不常用到而又很实用的重载-Split
- MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例
- amd,cmd规范
- 阿里八八β阶段Scrum(5/5)
- GDTR与LDTR
- ThreadPoolExecutor类
- 51Nod:1086背包问题 V2
- 如何用Percona XtraBackup进行MySQL从库的单表备份和恢复【转】
- 后缀crt证书转换
- 手机联系人信息获取(contacts) ---- HTML5+
热门文章
- 如何用photoshop把图片白色背景变成透明?
- 关于url中的#-----hash
- 巧用CSS3伪类选择器自定义checkbox和radio的样式
- nslookup
- 2014 ACM/ICPC Asia Regional Xi&#39;an Online
- (十七)linux网络命令 vconfig ifconfig
- startActivity跳转失败而且没有异常信息
- 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】
- m.Tomcat使用openssl走APR通道配置单向和双向认证
- Python之路 day2 按行读文件