oc中的一些常用方法
2016-12-02 09:11
204 查看
-(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] 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调用和直接调用的区别
下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用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学习 第五章 NSString和NSMutablestring的一些常用方法
- 【OC 第3课】NSString ,NSMutableString用法以及一些常用方法
- OC学习笔记16--OC中文件操作-NSFileManager的使用及文件操作中常用的一些字符串方法
- OC中 NSObject 对象常用的一些方法
- OC中一些常用小方法(不定时更新)
- OC NSString 的一些常用方法
- oc基础学习NSString的创建和一些常用的方法
- OC一些常用值取得方法
- VC中的一些常用方法(20条)
- 一些常用公共方法
- 一些非常有用的JAVA常用方法[转]
- Asp.NET中常用的一些优化性能的方法
- 一些非常有用的JAVA常用方法,可以省力很多啊!! xiaoyou [原作]
- 常用的一些网站评估方法
- 介绍一些在网络编程中常用的工具方法
- VC中的一些常用方法(20条)
- VC中的一些常用方法(20条)
- 一些常用的系统解决方法
- 一些非常有用的JAVA常用方法(1)
- VC中的一些常用方法(20条) [转帖]