< Objective-C >协议,反射和类别
协议(@protocol):相当于java的接口
协议的方法不一定要实现,可以使用@required和@optional来设置,默认为@required(ob为弱语法,即使不实现必选方法编译运行也不会报错)
Class的反射
常用方法
Class 变量名 = [类或者对象 class];
Class 变量名 = [类或者对象 superclass];
Class 变量名 = NSClassFromString(方法名字的字符串);
NSString *变量名 = NSStringFromClass(Class类型参数);
通过类名的字符串形式实例化对象
Class class = NSClassFromString(@"Student"); id obj = [[class alloc]init]; NSLog(@"创建的对象为:%@",obj)
NSObject中提供的自省方法
-(BOOL)isKindOfClass:(Class)aClass 判断对象是不是属于指定类型或其子类
-(BOOL)isMemberOfClass:(Class)aClass 判断对象是不是属于指定类型
-(BOOL)isSubclassOfClass:(Class)aClass 判断对象是不是属于指定类型的子类
-(BOOL)conformsToProtocol:(Protocol *)aProtocol 判断某个类/对象是否实现某个协议(参数使用@protocol(MyProtocol)传入)
类别(Category):为现有的类添加新方法的方式
类别的类别声明
@interface ClassName(CategoryName)
-(void)addMethod;
@end
类别实现
#import"ClassName+CategoryName.h"
@implementation ClassName(CategoryName)
-(void)addMethod {
//添加方法实现的代码;
}
@end
类别的好处
想对框架提供的类进行扩展(没有源码)
不想生成一个新的子类的情况下,比如对NSArray的扩展
方便做项目管理,可以将一份源码(未扩展的类)在多个地方共享,多人协作开发
对系统框架进行无缝扩充
转载于:https://www.cnblogs.com/aY-Wonder/p/4579919.html
- 点赞
- 收藏
- 分享
- 文章举报
- < Objective-C >使用kvc获取数组最大最小值
- DbContext 和ObjectContext两者的区别
- You may flag objectionable statements for review by a moderator
- 第13章 LINQ to Object
- How to update an object in Windchill with IBAs
- How to get objects from Info*Engine Group in Wi...
- How to create a new object in Windchill with IBAs
- How to iterate object in Windchill
- Object类中的方法
- Convert: String to JSONObject, JSONObject to Instance
- django:ERROR:root:'NoneType' object has no attribute 'utcoffset'
- AttributeError:'module'_object_has_no_attribute 'SSL_ST_INIT'
- Ubuntu新安装opencv运行运行第一个程序报错:cannot open shared object file: No such fi
- 第21条:理解Objective-C错误模型
- impdp ORA-39166 Object was not found
- How to know one object's dependence?
- bert-serving-start TypeError: 'NoneType' object is not iterable
- ORA-38301: can not perform DDL/DML over objects in Recycle Bin
- typeof、instanceof、Object.prototype.toString.call() 区分对象类型
- 匿名内部类 Math方法 Object Arrays