一、什么是属性?属性会帮咱们作哪些事情?请详细说明。程序员
(1)①属性是Objective-C 2.0定义的语法,为实例变量提供了setter、getter方法的默认实现;②能在必定程度上简化程序代码,而且加强实例变量的访问安全性。安全
(2)①属性会对于你声明的实例变量,它会默认帮你补齐你所须要的(你没有声明的,或者你没有实现的)getter,setter方法;②若是你不满意系统默认生成的getter,setter方法 须要同时重写一个实例变量的getter,setter方法,这时就须要注明 @synthesize 而后用实例变量去赋值属性名 // name = _name 不要写反。多线程
二、什么是Attribute?属性的Attribute有几大类?都有什么做用?性能
(1)Objective-C提供属性的目的是为了简化程序员编码,而且为属性提供了一些关键字用以控制setter、getter的实现细节,这些关键字咱们称为属性的属性(Attribute);优化
(2)一共3大类Attribute;编码
(3)第一类:读写性控制(readonly、readwrite、setter、getter)atom
①readonly,告诉编译器,只声明getter方法(无setter方法)。spa
例如:@property(readonly)NSString *name; //等价于:- (NSString *)name;线程
②readwrite,告诉编译器,既声明setter又声明getter。对象
例如: @property(readwrite)NSString *name; //等价于:- (void)setName:(NSString *)name; - (NSString *)name;
③readwrite是读写性控制的默认设置。
第二类:原子性控制(nonatomic、atomic)
①atomic:setter、getter方法在多线程访问下是绝对安全的,即 setter、getter内部作了多线程访问处理(原子性控制的默认设置是 atomic);
②nonatomic:setter、getter方法内部不会作多线程访问处理,仅仅是普通的setter、getter方法;
注意:①程序开发过程当中,setter、getter到处都在用,若是使用atomic,须要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,下降系统性能;
②一般设置为nonatomic,某些属性须要线程安全的时候,才定义为atomic。
例如:例如:@property (readwrite,nonatomic)NSString *name; //等价于:- (void)setName:(NSString *)name; - (NSString *)name;
第三类:语义设置(assign、retain、copy)
①assign。setter、getter内部实现是直接赋值。
示例:例如:@property(nonatomic,assign)int age;
②retain。setter、getter的内部实现会作内存优化。
示例:例如:@property(nonatomic,retain)NSString *name;
③copy。setter、getter的内部实现也会作内存优化。
示例:例如:@property(nonatomic,copy)NSString *name;
提示:①若是属性是非对象类型(好比int,float等)属性的语义设置使用assign;
②若是属性是对象类型(好比NSStrng、NSArray等)属性的语义设置使用retain;
③若是属性是对象类型而且想获得参数的copy,使用copy关键字。
三、要想使用点语法必需要知足什么条件?
凡是符合系统默认setter、getter书写格式的方法均可以使用点语法。
例如:[person setName:@"zhangsan"]; 能够等价写成 person.name = @"zhangsan";
NSString *name = [person1 name]; 能够等价写成 NSString *name = person1.name;
四、使用点语法的实质就是在调用setter,getter方法.那何时是在调用setter方法,何时是在调用getter方法呢?
有赋值操做就是在调用setter方法, 没有赋值只是当作一个值使用的时候就是调用getter方法。
五、KVC的全称是什么?
KVC全称:(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法。 key:键,用于标识实例变量;vlaue:实例变量对应的值。
六、在KVC中,给对象的一个实例变量赋值,用什么方法?
①普通键值:setValue:forKey:
②有层级关系的赋值:好比:学生的老师的女友 [stu tea.gf] 就用:setValue:forKeyPath:
七、在KVC中,若是在赋值或取值过程当中,key所对应的实例变量不存在,执行的结果是什么?如何避免?
当key不存在 防止崩溃 就在对应的类.m文件中重写setter方法就用 setValue:forUndefinedKey:
示例:
八、在KVC中给一个对象的实例变量批量赋值采用什么方法?
批量赋值 把键值对存放在字典里 而后直接赋值字典 就用 setValuesForKeysWithDictionary:
Email:dingding3w@126.com