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  运行时调用某个方法
(void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; 延时调用某个方法

(一)关于isKindOfClass和isMemberClass的区别,在网上看到一个很形象的例子,这里就直接拿来用了。

这里有两个类,分别是继承于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] teacherTeacher类或Teacher的子类2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacherPerson类或Person的子类2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacherNSObject类或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调用和直接调用的区别

下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用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调用即可。




0 0
原创粉丝点击