OC学习篇之---Foundation框架中的NSObject对象 分类: IOS 2014-12-07 16:06 2093人阅读 评论(0) 收藏

前一篇文章讲到了OC中的代理模式:http://blog.csdn.net/jiangwei0910410003/article/details/41777627,并且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始咱们开始介绍Foundation框架。java

OC中的Foundation框架是系统提供了,他就至关因而系统的一套api,和Java中的一些系统jar很类似,又早起的一批人开发的,内部有不少现有的类和功能提供给咱们使用。那么今天首先来介绍一下Foundation框架中的第一个类NSObjectapi

在以前介绍了类的相关知识,咱们看到咱们自定义的类都必须实现NSObject类,这个类内部有不少现有的方法能够供咱们使用,好比咱们常用的alloc和init方法,就是NSObject提供的,下面就在来看一下他的一些其余经常使用方法:框架


经过代码来演示每一个方法的做用:oop

Person.hpost

//
//  Person.h
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)invoke;

@end


Person.m

//
//  Person.m
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)invoke{
    NSLog(@"invoke is Executing...");
    [self demo1];//对象调用
    
    //performSelector方法调用
    NSString *result = [self performSelector:@selector(demo1)];
    NSLog(@"%@",result);
    
    //调用有一个参数的方法
    [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
    
    //调用有两个参数的方法
    [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
    
    //延迟调用一个方法
    //此处的延迟调用,代码不会停留在此处,为了避免阻塞线程
    [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
    
    //若是没有如下代码的话,上面的延迟调用就不会有效果的,由于他不会阻塞当前线程,因此当前线程中后续的代码会继续执行
    //在main.m中得main方法中,会直接return,这样程序就运行结束了,因此来不及执行2.5s以后方法执行
    //如下代码让执行过程停在此处
    [[NSRunLoop currentRunLoop] run];
    
}

- (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);
}

@end

main.m
//
//  main.m
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Person.h"

//isEqual判断两个指针是否指向同一个对象

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //1.--------------------isEqual方法
        NSObject *obj1 = [[NSObject alloc] init];
        NSObject *obj2 = [[NSObject alloc] init];
        
        if([obj1 isEqual:obj2]){
            NSLog(@"obj1 == obj2");
        }else{
            NSLog(@"obj1 != obj2");
        }
        
        //或者直接用等号判断
        if(obj1 == obj2){
            //do something...
        }else{
            //do something...
        }
        
        
        //2.--------------------performSelector方法
        //调用invoke方法
        //延迟调用某一个方法
        Person *p = [[Person alloc] init];
        [p performSelector:@selector(invoke)];
        
        //3.--------------------isKindOfClass和isMemberOfClass方法
        Person *rose = [[Person alloc] init];
        //判断rose是否属于Person类建立的
        //BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
        BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
        if(isBelongTo == YES){
        }else{
        }
        
        //判断rose是否属于子类建立的
        //判断一个类是否是一个类的子类
        isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO
        
        
        //4.---------------------respondsToSelector方法
        //判断类中是否有特定的方法(有实现的方法所有返回YES,若是只在.h文件中定义了,返回的是NO)
        //同时这种方式能够实现调用所谓的私有方法
        Person *task = [[Person alloc] init];
        isBelongTo = [task respondsToSelector:@selector(invoke)];
        if(isBelongTo){
        }else{
        }
        
    }
    return 0;
}


下面来一一介绍一下方法的做用

一、isEqual方法spa

//1.--------------------isEqual方法
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
        
if([obj1 isEqual:obj2]){
     NSLog(@"obj1 == obj2");
}else{
     NSLog(@"obj1 != obj2");
}
        
//或者直接用等号判断
if(obj1 == obj2){
     //do something...
}else{
     //do something...
}

他的做用就是判断两个指针变量是否指向同一个对象,在OC中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是同样的,可是在Java中是不一样的,Java中的"=="是判断两个引用变量是否指向同一个对象,可是其equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其余对象类型,能够重写这个方法来进行操做)。.net


二、isMemberOfClass方法线程

//3.--------------------isKindOfClass和isMemberOfClass方法
Person *rose = [[Person alloc] init];
//判断rose是否属于Person类建立的
//BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
if(isBelongTo == YES){
}else{
}
这个方法的做用是判断一个指针变量指向的对象是否是属于一个类建立的,相似于Java中的obj.getClass()==Person.class效果。


三、isKindOfClass方法代理

//判断rose是否属于子类建立的
//判断一个类是否是一个类的子类
isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO
这个方法的做用是判断一个指针变量指向的对象是否是一个类的子类,相似于Java中的instanceof关键字的做用


四、respondsToSelector方法指针

//4.---------------------respondsToSelector方法
//判断类中是否有特定的方法(有实现的方法所有返回YES,若是只在.h文件中定义了,返回的是NO)
//同时这种方式能够实现调用所谓的私有方法
Person *task = [[Person alloc] init];
isBelongTo = [task respondsToSelector:@selector(invoke)];
if(isBelongTo){
}else{
}
这个方法咱们在以前的文章中使用过了,他的做用就是判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES

若是只在.h文件中定义了,没有在.m文件中实现的话,也是返回NO的

若是这个方法没有在.h文件中定义,可是在.m文件中有实现的话(私有方法),返回YES

只要方法在.m文件中有才会返回YES

这个方法的功能若是在Java中可使用反射去实现


五、performSelector方法

- (void)invoke{
    NSLog(@"invoke is Executing...");
    [self demo1];//对象调用
    
    //performSelector方法调用
    NSString *result = [self performSelector:@selector(demo1)];
    NSLog(@"%@",result);
    
    //调用有一个参数的方法
    [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
    
    //调用有两个参数的方法
    [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
    
    //延迟调用一个方法
    //此处的延迟调用,代码不会停留在此处,为了避免阻塞线程
    [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
    
    //若是没有如下代码的话,上面的延迟调用就不会有效果的,由于他不会阻塞当前线程,因此当前线程中后续的代码会继续执行
    //在main.m中得main方法中,会直接return,这样程序就运行结束了,因此来不及执行2.5s以后方法执行
    //如下代码让执行过程停在此处
    [[NSRunLoop currentRunLoop] run];
    
}

- (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);
}

这个方法的做用就是调用对象中的一个方法,看到上面的例子,这个方法有不少样式:

无参数样式

[self performSelector:@selector(demo1)]


一个参数的样式

//调用有一个参数的方法
[self performSelector:@selector(demo2:) withObject:@"jiangwei"];


两个参数样式

//调用有两个参数的方法
[self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];


可是咱们看到上面的调用方式,感受不到这个方法的用途,由于咱们彻底能够直接调用demo1方法

[self demo1]


在看看他的一种样式

//延迟调用一个方法
//此处的延迟调用,代码不会停留在此处,为了避免阻塞线程
[self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
能够延迟的调用一个方法,这才是该方法的核心做用,他的做用相似于Android中的postDelayed(Runnable runable)方法,一样,这个方法会在后面UI使用中常用到,可以延迟的调用一个方法。


同时他还有一个做用能够直接调用一个类的私有方法,即只在.m文件中实现了的方法:

Person *task = [[Person alloc] init];
isBelongTo = [task respondsToSelector:@selector(demo1)];
if(isBelongTo){
    [task performSelector:@selector(demo1)];
     NSLog(@"YES");
}else{
     NSLog(@"NO");
}
他回常常结合respondsToSelector方法一块儿使用,这里demo1就是一个私有的方法,若是在Java中须要用到反射,而后还要强暴一下这个私有方法才能调用。在OC中的实现就简单了。


总结

这篇文章就介绍了OC中的Foundation框架中的NSObject对象中的一些经常使用方法。

相关文章
相关标签/搜索