OC学习四-----NSObject中常用方法

isEqual方法:判断两个指针变量是否指向同一个对象

NSObject *obj1 = [[NSObject alloc] init];
NSOBject *obj2 = [[NSObject alloc] init];
if([obj1 isEqual:obj2]){//也可直接用 == 判断
    NSLog(@"obj1 == obj2");
}else{
    NSLog(@"obj1 != obj2");
}

OC中直接使用 == 来进行比较和使用 isEqual方法,效果是一样的,但是在Java中是不同的,Java中“==”是判断两个引用变量是否指向同一个对象,但是equal方法是判断两个对象的值是否相等,这里的值是指基本数据类型,其他对象类型,可以重写这个方法来进行操作。

isMemberOfClass方法

Person *psrson = [[Person alloc] init];
Bool isBelongTo = [parson isMemberOfClass:[NSObject class]];//返回NO
//Bool isBelongTo = [parson isMemberOfClass:[Person class]];//返回YES
if(isBelongTo == YES){
}else{
}

这个方法的作用是判断一个指针变量指向的对象是不是属于一个类创建的,类似于Java中的
obj.getClass() == Person.class效果。

isKindOfClass方法

isBelongTo = [person isKindOfClass:[NSObject class]];//返回YES

用来判断某个对象是否属于某个类,或者属于某个类的派生类。
可以用来判断出所有了都是基于NSObject类的事实。isMemberOfClass不可以。

respondsToSelector方法

//判断类中是否有特定的方法
Person *person = [[Person alloc] init];
isBelongTo = [person respondToSelector:@selector(invoke)];

判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES
如果在.h文件中定义了,没有在.m文件中实现的话,返回NO
如果这个方法没有在.h文件中定义,但是在.m文件中有实现的话(私有方法),返回YES
只要在.m文件中有才会返回YES
在Java中可以使用反射实现

performSelector方法

-(NSString *)demo1{
    NSLog(@"demo1");
    return @"demo1";
}
-(void)demo2:(NSString *)str{
    NSLog(@"str = %@",str);
}
-(void)demo3:(NSString *)str withName:(NSString *)name{
    NSLog(@"str =  %@,name = %@",str,name);
}

-(void)invoke{
    [self demo1];//直接对象调用
    //performSelector方法调用
    NSString *result = [self performSelector:@selector(demo1)];
    //performSelector调用一个参数的
    [self performSelector:@selector(demo2:) withObject:@"str内容"];
    //调用两个参数的
    [self performSelector:@selector(demo3:) withObject:@"str内容" withObject:@"name内容"];

    //延时调用一个方法,此处的延时调用,代码不会停留在此处,为了不阻塞线程
    [self performSelector:@selector(demo1) wothObject:Null afterDelay:2.5];
    //如果没有一下代码,上面的延时调用就没有效果,因为他不会阻塞当前想成
    //所以当前线程中后续的代码会继续执行,在main.m中的main方法中,会直接ruturn,这样程序就运行结束了
    //以下代码会让代码执行过程停在此处
    [[NSRunLoop currentRunLoop] run];
}

performSelector方法有很多样式,可以调用无参数的,一个参数的、两个参数的等,这些用处不大,因为我们可以直接调用demo1、demo2、demo3方法,不需要通过performSelector方法调用
但是performSelector方法有一个延迟调用的功能,这个是其核心作用,类似于Android中的postDelayed(Runnable runable)方法。同时这个方法还可以直接调用一个类的私有方法,即只在.m文件中实现了的方法

Person *person = [[Person alloc] init];
isBelongTo = [person respondsToSelector:@selector(demo1)];
if(isBelongTo){
    [person performSelector:@selector(demo1)];
}else{}

performSelector方法经常会和respondsToSelector方法一起使用,治理的demo1就是一个私有方法,如果在Java中需要用到反射才可以。OC中实现就很简单。

猜你喜欢

转载自blog.csdn.net/qq_34198206/article/details/84760298
今日推荐