您的位置:首页 > 移动开发 > Objective-C

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十一章 属性

2017-07-18 18:55 806 查看

11.1 使用属性值

@property float rainHandling;
//表明此类具有float类型的属性,其名称为rainHandling


注意:属性的名称不必与实例变量名称同样。

@synthesize rainHandling;
//表示创建了该属性的訪问代码


注意:使用属性后,能够不声明实例变量。编译器会声明。

有两个地方能够加入实例变量声明:

头文件:让子类直接通过属性訪问变量

实现文件:变量仅仅属于当前类

点表达式:

点表达式出如今(=)的左边:setter方法

点表达式出如今(=)的右边:getter方法

注意:假设訪问属性提示訪问的对象不是struct类型,请检查当前类是否已包括了所需的必备头文件

11.2 属性扩展

属性同样适用于int,char。BOOL,struct类型,也能够定义一个NSRect对象的属性

保留死循环(retain cycle):Car对象拥有engine对象,可是engine对象不能反过来拥有Car对象。

copy特性

name存取方法:

- (void)setName: (NSString *)newName {
[name release];
name = [newName copy];
} // setName

- (NSString *)name {
return (name);
} // name


等同于:

//name属性是copy特性
@property (copy) NSString *name;
@synthesize name;


retain特性

engine 的存取方法:

- (void) setEngine: (Engine *) newEngine{

[newEngine retain];
[engine release];
engine = newEngine;

} // setEngine

- (Engine *) engine{
return (engine);
} // engine


等同于:

//engine属性使用的是保留和释放特性
@property (retain) Engine *engine;
@synthesize engine;


noatomic特性:iOS程序常常使用的技术。资源有限的设备上获得更好的性能。

假设自定义了存取方法。那么必须使用nonatomic特性。

默认特性:假设没有为属性指定不论什么特性,它们会默认使用nonatomic和assign特性。

11.21 名称的使用

属性的名称一般与支持属性的实例变量名称同样。

有时程序猿希望实例变量是一个名称,而公开的属性是还有一个名称。

@property(copy)NSString *name;
@synthesize name = appellation;
// 编译器将创建-setName:和-name方法,但在实现代码中用的是appellation实例变量。


注意

直接訪问实例变量:
self.name


使用訪问方法进行赋值:
[self setName:@"Car"];


11.22 仅仅读属性

对于仅仅能读取,无法更改的值:

@property(readonly)float shoeSize;


注意:仅仅生成一个getter方法而不会生成setter方法

11.23 自己动手

@dynamic
告诉编译器不要生成不论什么代码或创建对应的实例变量。

改变方法名:

使用getter=和setter=特性就能够自定义想要的方法名称

@property (getter=isHidden) BOOL hidden;
//告诉编译器生成名为isHidden的getter方法,并生成名为默认setHidden:的setter方法


注意:属性仅仅支持替代-setBlah和-blah方法,但不支持那些须要接收额外參数的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐