OC——Foundation—常用的类(5)——NSObject和反射、copy语法
2015-04-14 15:38
417 查看
反射:
OC反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象的方法的功能成为OC的反射机制。
Class反射
通过类名的字符串形式实例化对象
将类名变成字符串
SEL的反射
通过方法的字符串形式实例化方法
将方法变成字符串
copy和mutableCopy(copy语法的目的是:改变副本不影响源对象)
一个对象使用copy或mutableCopy方法可以创建对象的副本
copy-需要先实现NSCopying协议,创建的是不可变的副本(如NSString、NSArray、NSDictionary)
mutableCopy-需要先实现NSMutableCopying协议,创建的时可变的副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1(本质是看是否产生新的对象)
浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作(本质是看产生的对象是否与源对象相同)
只有不可变的对象创建不可变副本才是浅复制
调用copy或mutableCopy方法产生的副本与源对象无关,只于对象调用的方法有关
copy语法示例:
MutableCopy示例:
copy语法注意事项:
如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法
如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法
以copy为例,建议用[self class]代替直接类名
OC反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象的方法的功能成为OC的反射机制。
Class反射
通过类名的字符串形式实例化对象
将类名变成字符串
SEL的反射
通过方法的字符串形式实例化方法
将方法变成字符串
//类名的反射 NSString *str=@“Person”; Class class=NSClassFromString(str); Person *person=[[class alloc]init]; //类转换为字符串 NSString *name=NSStringFromClass([Person clas]); //方法的反射 NSString *method=@“test”; SEL selector=NSSelectorFromString(method); [person performSelector:selector]; //将方法转换为字符串 NSString *selectorname=NSStringFromSelector(selector);
copy和mutableCopy(copy语法的目的是:改变副本不影响源对象)
一个对象使用copy或mutableCopy方法可以创建对象的副本
copy-需要先实现NSCopying协议,创建的是不可变的副本(如NSString、NSArray、NSDictionary)
mutableCopy-需要先实现NSMutableCopying协议,创建的时可变的副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1(本质是看是否产生新的对象)
浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作(本质是看产生的对象是否与源对象相同)
只有不可变的对象创建不可变副本才是浅复制
调用copy或mutableCopy方法产生的副本与源对象无关,只于对象调用的方法有关
copy语法示例:
NSString *str1=[[NSString alloc]initWithFormat:@“age is 10”]; NSString *str2=[str1 copy]; //copy出来的还是原来的对象,没有产生新的对象
MutableCopy示例:
NSString *str=[[NSString alloc]initWithFormat:@“age is 10”]; NSMutableString *str1=[str MutableCopy]; //产生了新的对象,因此是深度复制
copy语法注意事项:
如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法
如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法
以copy为例,建议用[self class]代替直接类名
相关文章推荐
- Foundation框架(15)——NSObject的常用方法、OC中的反射
- Foundation5 NSObject和反射,copy语法
- oc-Foundation框架- NSObject-常用方法-反射
- 黑马-OC语法-Foundation-常用结构体
- iOS开发—OC语言Foundation框架(一)—NSObject常用方法
- OC语法<4.8> Foundation框架中的-常用结构体和基本数据类型包装类
- OC——Foundation—常用的类(4)——NSNumber、NSValue、NSNull、NSDate
- oc-Foundation框架-NSString-常用方法-路径相关
- oc-Foundation框架-NSValue-常用方法
- OC学习篇之---Foundation框架中的NSObject对象
- OC语法<4.4> Foundation框架中的集合类-NSSet
- OC语法<4.7> Foundation框架中的-日期操作
- 黑马程序员——IOS基础——Foundation框架——字典、集合类、NSNumber/NSValue、NSObject、反射
- oc-Foundation框架-NSMutableArray-常用方法
- OC学习篇之---Foundation框架中的NSObject对象
- Objective-C学习笔记(三):OC之常用的OC语法下
- NSObject常用方法 和反射
- NSObject常用方法和反射
- 黑马程序员-IOS-OC基础-浅析Copy语法
- NSObject常用方法 和 常用的一些类的反射