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是⼀种间接访问实例变量的⽅法。
属性是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是⼀种间接访问实例变量的⽅法。
相关文章推荐
- iOS -- 插件
- Swift的可选的和可选链
- OSPF(Open Shortest Path First开放式最短路径优先 -链路状态路由协议
- 快速安装多系统(xp与win7)
- CSS基础(02)
- java获取错误行号和方法名类名等信息
- 获取 APP 的 Launch Image
- 高级搜索库tcmalloc 在 MySQL中的应用
- 修改Tomcat服务器的默认端口号
- 数据表的自身连接
- 关于cell的重用标识符的问题
- JDK1.8中 接口成员变量和成员方法
- Log4j学习笔记
- URLSession
- 阅读信号方面的知识
- Android开发总结笔记 ListView(列表视图[下]) 1-3-3
- AlertDialog的单选按钮对话框
- LeetCode OJ:Compare Version Numbers(比较版本字符串)
- cocos2dx项目打包apk(一)
- #在蓝懿学习iOS的日子#Day11