博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C之成魔之路【8-訪问成员变量和属性】
阅读量:6920 次
发布时间:2019-06-27

本文共 2827 字,大约阅读时间需要 9 分钟。

郝萌主倾心贡献,尊重作者的劳动成果。请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 

我要捐赠: 

Cocos2d-X源代码下载:

訪问成员变量
从面向对象的封装角度考虑问题, 要想訪问类中的成员变量, 是要通过方法訪问的, 
成员变量前面要有作用域限定符(protected, public, private) , 
这些存取权限修饰符我们将在后面介绍。 
成员变量的訪问, 是通过读取方法(getter) 和设定方法(setter)。

訪问成员属性:

能够使用点运算符.。或发送消息[]

以上一节中的音乐类为样例:
Song.h文件
@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
//操作方法
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
//訪问成员变量方法
- (NSString *)title; 
- (void) setTitle:(NSString *) newTitle;
- (NSString *)artist; 
- (void) setArtist:(NSString *) newArtist;
- (long int)duration; 
- (void) setDuration:(long int) newDuration;
@end
Song.m文件
@implementation Song
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳过时间
}
//訪问成员变量方法
- (NSString *)title {
return title;
}
- (void) setTitle:(NSString *) newTitle {
title = newTitle;
}
- (NSString *)artist {
return artist;
}
- (void) setArtist:(NSString *) newArtist {
artist = newArtist;
}
- (long int)duration {
return duration;
}
- (void) setDuration:(long int) newDuration {
duration = newDuration;
}
@end
小结
採用了封装之后就能够通过存取方法訪问属性, 
比如[mySong title] 是取得title成员变量内容。 
假设不考虑封装的问题。 单从技术上讲Objective-C, 能够直接通过对象訪问成员变量的。 
訪问操作符是“->” 。 
比如:
mySong->title。 也能够取得title成员变量的内容。

须要指出的是。也能够对自己定义的方法使用点运算符,不不过使用在synthesize上(即属性)。

注意:

点运算符和发消息都是能够的,可是,点运算符通常使用在属性上,用于设置或取得实例变量的值。

方法在Apple的文档中被标记为任务(Task),任务通常不是由点运算符运行的,

而是使用传统的方括号形式的消息表达式作为首选的语法。

另外。使用合成(synthesize)的存取方法。属性名称的前面不要以new、alloc、copy和init这些此开头。

这与编译器的一些假定有关,由于编译器会合成对应的方法。

属性
对于成员变量的訪问, 要通过读取方法(getter) 和设定方法(setter) 。 
在实现部分也要实现这些读取方法和设定方法。 
为了简化这些琐碎编码Objective-C2.0提出属性的概念, 
使用 @propertykeyword在接口部分定义属性, 
在实现部分使用 @synthesizekeyword在组装和合成这些属性。

这样的可自己主动生成设值方法和取值方法(统称为存取方法)。

详细过程例如以下:

1)在接口部分中使用@property指令标识属性。

@interface Fraction : NSObject

@property int numerator, denominator;

@end

2)在实现部分使用@synthesize指令就可以。

@inplementation Fraction

@synthesize numerator, denominator;

@end

再次实现头文件例如以下:
@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
//操作方法
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
//訪问成员变量方法
@property(copy,readwrite) NSString *title;
@property(nonatomic,retain) NSString *artist;
@property(readonly) long int duration;
@end
代码说明:
声明property的语法为: @property (參数) 类型 名字; , 
这里的“參数” 主要分为3大类: 
•读写属性(readwrite/readonly) ; 
•内存管理(assign/retain/copy) , 这些内存管理的參数。 我们将在内存管理小节部分介绍; 
•原子性atomicity(nonatomic) , 是关系线程线程安全的,
atomicity是原子性的线程安全的, 可是会影响性能。 
假设确定不考虑线程安全问题能够使用 nonatomic。

注意:

假设使用了@property指令,就不须要在实现部分声明对应的实例变量。

通常。假设有称为x的属性,那么在实现部分包含下面行会导致编译器自己主动实现一个取值方法x和一个设置方法setX:

@synthesize x;

由于生成的存取方法是高效的。而且在使用多个核心的多台机器上。使用多线程时也可正常执行。

(这里的说法呢,就是说线程安全的)

实现.m文件例如以下:
@implementation Song
@synthesize title;
@synthesize artist;
@synthesize duration;
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳过时间
}
@end

你可能感兴趣的文章
eclipse中使用hibernate连接mysql
查看>>
k8s 面向应用开发者的基础命令
查看>>
RDS 5.7的物理备份恢复到本地的方法
查看>>
C# Winform快速开发平台与软件配置平台
查看>>
Kubernetes 新概念 “Initializers”解析(上):能让你为集群编写插件的新模型
查看>>
sql server 高可用故障转移(完结)
查看>>
MSSQL sql server order by 1,2 的具体含义
查看>>
蚂蚁的开放:想办法摸到10米的篮筐
查看>>
WPF 线程:使用调度程序构建反应速度更快的应用程序
查看>>
使用Docker(Mac)搭建 Nginx/Openresty - Kafka - kafkaManager
查看>>
“搜狗分身”技术正式亮相乌镇,携手新华社发布全球首个AI合成主播
查看>>
WPF 启动唯一程序(项目,exe,实例)
查看>>
lecture 2:more Objective-C and Demo
查看>>
Storm源码分析--Nimbus启动过程
查看>>
iOS的Cookie管理
查看>>
利用优酷云SDK仿今日头条短视频播放
查看>>
NSA 将向公众开源逆向工程工具 GHIDRA
查看>>
DKHadoop大数据平台架构详解
查看>>
从品钛IPO看,如何判断一家金融科技公司的科技底色
查看>>
C语言基础——循环详解!
查看>>