标签:
一.属性
1>.属性为实例变量提供了setter,getter方法的默认实现. 使用@Property,@sythesize能在一定程度上简化程序代码,并且增强实例变量的访问安全性
2>. 属性的声明:使用@property声明属性(例如:@property NSString *name;) 该关键字可以自动生成某个成员变量的setter和getter方法的声明
相当于@interface中声明了两个方法:
- (void)setName:(NSString *)name;
- (NSString *)name;
属性的实现:使用@synthesize实现属性(例如:@synthesize name = _name)该关键字帮助生成成员变量的setter和getter方法的实现
相当于@implementation实现了:
- (void)setName:(NSString *)name;
- (NSString *)name;
属性的使用注意:首先,@properety和@sythesize配合使用,可取代setter/gstter的声明与使用.并且可以用","连用. 其次,最终可以简化成只有@property声明,就可以完成对整个setter/getter声明实现的全过程,但是注意这种方式生成的成员变量是private的。(@property int age;这句话完成了3个功能:1)生成_age成员变量的get和set方法的声明;2)生成_age成员变量set和get方法的实现;3)生成一个_age的成员变量)
3>重命名setter和getter的方法
.h 文件内的重命名声明
main.m文件内的调用形式
实例:此实例在学习属性的同时,帮助回顾初始化,和遍历构造器的使用
Teacher.h文件
Teacher.m文件
main.m文件
二.属性的属性
1 .可读性: readonly 、readwrite
1>.@property(readwrite,....)
valueType value;
readWrite 属性是变量的默认属性,就是如果你(readwrite and readonly 都没有使用,那么你的变量就是readwrite属性),通过加入readwrite属性你的变量就会有get方法,和set方法。
2>.property(readonly,...) valueType
value;
这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的 get 方法。
main.m调用
2.第二类.原子性控制(nonatomic atomic)
atomic : setter,getter方法在多线程访问下是绝对安全的,即setter,getter内部做了多线程访问处理,但是它需要对setter,getter加锁解锁以保证线程访问的安全,会很占用系统资源,降低系统性能.
nonatomic : 通常设置为nonatomic,此为非原子性访问,不加同步,多线程并发访问会提高性能。在此方法中,setter,getter方法内部不会做多线程访问处理,仅仅是普通的setter,getter方法,nonatomic为默认的设置形式.
注意点: 1>.如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级
。 所以 不加 nonatomic 对多线程是安全的 。
2>.(nonatomic)非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
扩展:atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
3.第三类.语义设置( assign,retian,copy)
assign 用于基本数据类型即非对象类型(如int,float等).此为默认设置形式.此方法对setter,getter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题.
扩展:在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。
retain:set方法的实现是release旧值,retain新值,所有实现都是这个顺序.用于OC对象类型(NSString ,NSSarray等)
扩展:指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。
copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型.,属性是对象类型并且想得到参数的copy,就是用copy关键字
扩展:setter 方法进行 Copy 操作,与 retain 处理流程一样,先旧值 release ,再 Copy 出新的对象, retainCount 为 1 。这是为了减少对上下文的依赖而引入的机制。它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论.
附网文:
Retain vs. Copy
copy :
建立一个索引计数为 1 的对象,然后释放旧对象
retain :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为 1
Copy其实是建立了一个相同的对象,而 retain不是:比如一个 NSString 对象,地址为 0×1111,内容为 @”STR”Copy到另外一个NSString之后,地址为 0×2222,内容相同,新的对象 retain为1,旧有对象没有变化, 而retain到另外一个 NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值 +1.也就是说,retain是指针拷贝,copy是内容拷贝。
示例代码:
assign,retain,copy方法实例应用(面试题)
三.点语法的使用
NSString *name = [person name]; 等价于:NSString
*name
= person.name;
注意:只有在声明setter和getter(或@property,@sythsize)的基础之上才能使用点语法.没有相应的setter/getter声明不能使用点语法,因为点语法本质上只是的另一种调用形式.
示例代码:
重点理解和常见错误
四.KVC
KVC(Key-Value-Coding),键值编码,是一种间接访问实例变量的方
法。 key:键,?用于标识实例变量 value:实例变量对应的值.
核心关键语法: 1>.setValue: forkey:
2>.valueForKey:
2>.当key不存在的时候,会执行setValue:forUndefinedKey:
此种情况用于网络请求数据时,有时没有对应key值,所以为防止程序崩溃而使用,(只写格式就起作用)
第八讲.属性(@proporty,@synthsize) , 属性的attribute, 点语法,kvc
标签:
原文地址:http://www.cnblogs.com/erdeng/p/4774115.html