Objective-C之成魔之路【8-訪问成员变量和属性】
郝萌主倾心贡献,尊重作者的劳动成果。请勿转载。
假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源代码下载:点我传送
成员变量的訪问, 是通过读取方法(getter) 和设定方法(setter)。
訪问成员属性:
能够使用点运算符.。或发送消息[]
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
- (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
假设不考虑封装的问题。 单从技术上讲Objective-C, 能够直接通过对象訪问成员变量的。
mySong->title。 也能够取得title成员变量的内容。
须要指出的是。也能够对自己定义的方法使用点运算符,不不过使用在synthesize上(即属性)。
注意:
点运算符和发消息都是能够的,可是,点运算符通常使用在属性上,用于设置或取得实例变量的值。
方法在Apple的文档中被标记为任务(Task),任务通常不是由点运算符运行的,
而是使用传统的方括号形式的消息表达式作为首选的语法。
另外。使用合成(synthesize)的存取方法。属性名称的前面不要以new、alloc、copy和init这些此开头。
这与编译器的一些假定有关,由于编译器会合成对应的方法。
详细过程例如以下:
1)在接口部分中使用@property指令标识属性。
@interface Fraction : NSObject
@property int numerator, denominator;
@end
2)在实现部分使用@synthesize指令就可以。
@inplementation Fraction
@synthesize numerator, denominator;
@end
再次实现头文件例如以下:
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
这里的“參数” 主要分为3大类:
•读写属性(readwrite/readonly) ;
•内存管理(assign/retain/copy) , 这些内存管理的參数。 我们将在内存管理小节部分介绍;
•原子性atomicity(nonatomic) , 是关系线程线程安全的,
假设使用了@property指令,就不须要在实现部分声明对应的实例变量。
通常。假设有称为x的属性,那么在实现部分包含下面行会导致编译器自己主动实现一个取值方法x和一个设置方法setX:
@synthesize x;
由于生成的存取方法是高效的。而且在使用多个核心的多台机器上。使用多线程时也可正常执行。
(这里的说法呢,就是说线程安全的)
@synthesize title;
@synthesize artist;
@synthesize duration;
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳过时间
}
@end