您的位置:首页 > 其它

OC第八天:属性

2015-11-04 20:47 253 查看
⼀、属性。
属性是Objective-C 2.0定义的语法,为实例变量提供了setter、 getter⽅法的默认实现
能在⼀定程度上简化程序代码,并且增强实例变量的访问安全性。
属性的定义
属性的声明:使⽤@property声明属性
@property NSString *name;
相当于@interface中声明了两个⽅法(setter、getter):
- (void)setName:(NSString *)name;
- (NSString *)name;
属性的实现
属性的实现:使⽤@synthesize实现属性
例如:@synthesize name = _name;
相当于@implementation实现了setter、getter
- (void)setName:(NSString *)name
{…}
- (NSString *)name
{…}
//默认属性的实现
关键字@synthesize

//喝茶 set get
方法

//相当于实现set get
方法

//等号前面
代表
你声明的属性的名称
//等号后面
代表
你要赋值的成员变量名称
@synthesize
name = _name;
⼆、属性的Attribute.
属性的属性
Objective-C提供属性的⺫的是为了简化程序员编码
为属性提供了⼀些关键字⽤以控制setter、getter的实现细节
这些关键字我们称为属性的属性(attribute)
⼀共3⼤类attribute。
第⼀类:读写性控制(readonly、readwrite、setter、getter)
readonly,告诉编译器,只声明getter⽅法(⽆setter⽅法)。
例如:@property(readonly)NSString *name;
//等价于 - (NSString *)name;
readwrite,告诉编译器,既声明setter⼜声明getter。
例如: @property(readwrite)NSString *name;
//等价于 - (NSString *)name; - (void)setName:(NSString *)name;
readwrite是读写性控制的默认设置。
第⼆类:原⼦性控制(nonatomic、atomic)
atomic。setter、getter⽅法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理。原⼦性控制的默认设置是 atomic

nonatomic。setter、getter⽅法内部不会做多线程访问处理,仅仅是 普通的setter、getter⽅法
程序开发过程中,setter、getter处处都在⽤,如果使⽤atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤系统资源,降低 系统性能。

通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
第三类:语义设置(assign、retain、copy)
例如:@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name
{ _name = name; }
- (NSString *)name
{ return _name; }
retain。setter、getter的内部实现会做内存优化。
例如:@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name){ [_name release];
_name = [name retain]; } }
- (NSString *)name
{ return [[_name retain]autorelease]; }
copy。setter、getter的内部实现也会做内存优化。
例如:@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name){ [_name release];
_name = [name copy]; } }
- (NSString *)name
{ return [[_name retain]autorelease]; }

如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤ assign。
如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设 置使⽤retain。
如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。
//
属性的属性

//
读写类属性

// readonly
只读(系统就不会默认生成set方法)

// readwrite
读写(如果什么都不写
默认就是读写)

// setter
设置给set指定名字

// getter
设置get
指定名字

//
原子类属性

// nonatomic
必写
没有多线程保护

//
第三类:语义设置(assign、retain、copy)

//
注意:创建工程
默认是ARC状态(自动管理内存)

//
手动管理内存 MRC

// assign set get方法的实现
是直接赋值的
一般咱们用
声明
基本数据类型时候使用

// retain set get方法的实现
内部实现对内存管理的优化
对象类型声明为retain
// copy
与retain
一样但是声明成copy有一个先决条件必须遵守NSCopying
协议并且实现其方法

三、点语法。
点语法是Objective-C 2.0中定义的语法格式。提供了⼀种便捷的 属性访问⽅式。
凡是符合系统默认setter、getter书写格式的⽅法都可以使⽤点语 法。
属性是⼀对getter、setter⽅法,点语法是属性的另⼀种调⽤格式。
//
点语法
提供了一种快捷的访问属性一种方式

//
快捷
调用set get方式

// =左边是调用set =右边是get

四、KVC
KVC(Key-Value-Coding),键值编码,是⼀种间接访问实例变量的⽅ 法。
key:键,⽤于标识实例变量
vlaue:实例变量对应的值
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValuesForKeysWithDictionary:
// 通过字典赋值一个对象
valueForKey:
valueForKeyPath:
valueForUndefinedKey:

当key不存在的时候,会执⾏setValue:forUndefinedKey:
系统默认实现是抛出⼀个异常
//
如果你使用间接访问的方法
访问属性的话需要重写

// setValue: forUndefinedKey:

//防止在系统抛出异常时候调用防止系统崩溃

//间接赋值的保护方法

//捕获间接访问属性时填错的key和value

//
传人的key的查找顺序

// _key _iskey key iskey

//
复合

//
本类中包含
其他类的一个对象
作为实例变量

// forKeyPath这个方法
相当于跨一级去间接访问属性
是访问本类中属性的属性
通过这个方法去访问的话需要传入一个

//路径

//-(void)setValue:(id)value forUndefinedKey:(NSString *)key

//{

// NSLog(@"%@ %@",value,key);

//

//}

//-(void)setNilValueForKey:(NSString *)key

//{

// NSLog(@"%@",key);

//}

总结
属性是Objective-C的重要语法,属性是⼀组getter、setter⽅法,内 部对实例变量进⾏操作。
点语法是⼀种属性的另外⼀种调⽤格式。
KVC是⼀种间接访问实例变量的⽅法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: