oc中的一些常用方法
来源:互联网 发布:node forever 重启 编辑:程序博客网 时间:2024/06/05 06:40
-(BOOL) isKindOfClass: classObj 判断某个对象是否是某个类或这个类的子类,可以继承
-(BOOL) isMemberOfClass: classObj 判断某个对象是否是某个类的成员,不可以继承
-(BOOL) respondsToSelector: selector 用来判断是否实现了某个方法(被封装在一个selector的对象里传递)
+(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
(BOOL)conformsToProtocol:(Protocol *)aProtocol; 是用来检查对象(包括其祖先)是否实现了指定协议类的方法。-(id) performSelector: selector 运行时调用某个方法(一)关于isKindOfClass和isMemberClass的区别,在网上看到一个很形象的例子,这里就直接拿来用了。(void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; 延时调用某个方法
这里有两个类,分别是继承于NSObject的Person,Person的Teacher
#import <Foundation/Foundation.h> @interface Person : NSObject { NSString *name; } -(void)setName:(NSString*)n; @end #import "Person.h" @implementation Person -(void)setName:(NSString *)n { name = n; } @end
#import "Person.h" @interface Teacher : Person -(void)teach; @end #import "Teacher.h" @implementation Teacher -(void)teach { NSLog(@"我教数学"); } @end
使用isKindOfClass的例子:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *person = [[Person alloc] init]; Teacher *teacher = [[Teacher alloc] init]; //YES if ([teacher isKindOfClass:[Teacher class]]) { NSLog(@"teacher 是 Teacher类或Teacher的子类"); } //YES if ([teacher isKindOfClass:[Person class]]) { NSLog(@"teacher 是 Person类或Person的子类"); } //YES if ([teacher isKindOfClass:[NSObject class]]) { NSLog(@"teacher 是 NSObject类或NSObject的子类"); } [person release]; [teacher release]; [pool release];
输出结果: 2012-07-04 14:34:17.315 ObjectiveCTest[2595:f803] teacher 是 Teacher类或Teacher的子类2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher 是 Person类或Person的子类2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher 是 NSObject类或NSObject的子类
使用isMemberOfClass的例子:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *person = [[Person alloc] init]; Teacher *teacher = [[Teacher alloc] init]; //YES if ([teacher isMemberOfClass:[Teacher class]]) { NSLog(@"teacher Teacher类的成员"); } //NO if ([teacher isMemberOfClass:[Person class]]) { NSLog(@"teacher Person类的成员"); } //NO if ([teacher isMemberOfClass:[NSObject class]]) { NSLog(@"teacher NSObject类的成员"); } [person release]; [teacher release]; [pool release];
输出结果:
2012-07-04 14:23:07.965 ObjectiveCTest[2460:f803] teacher Teacher类的成员
看了这两个例子,应该就会明白了。
(二)关于PerformSelector调用和直接调用的区别
[delegate imageDownloader:self didFinishWithImage:image];
[delegate performSelector:@selector(imageDownloader:didFinishWithImage:)withObject:self withObject:image];
1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。如果imageDownloader:didFinishWithImage:image:不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃);Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。所以有时候如果使用了performSelector,为了程序的健壮性,会使用检查方法
- (BOOL)respondsToSelector:(SEL)aSelector;
2、直接调用方法时候,一定要在头文件中声明该方法的使用,也要将头文件import进来。而使用performSelector时候, 可以不用import头文件包含方法的对象,直接用performSelector调用即可。
- oc中的一些常用方法
- OC中的一些基础方法
- OC中的字符串常用方法
- OC一些常用值取得方法
- OC NSString 的一些常用方法
- OC中的构造方法及一些注意
- OC中的字典以及常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- struts 中的一些常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- VC中的一些常用方法
- java 中的一些常用方法
- OC中 NSObject 对象常用的一些方法
- 分代垃圾回收
- Laravel中间件
- 典型配置
- 删除字符串中出现次数最小的字符及书写字符串函数时的一个注意点
- C++11新特性——容器相关(三)tuple
- oc中的一些常用方法
- 新一代的垃圾回收算法
- Python的APScheduler模块
- make menuconfig --资料查阅
- 我对MVC分层的理解
- POJ1416 切纸片 (DFS
- 判别手机系统是ios还是android
- 调优方法
- 桶排序Bucket sort