黑马程序员--Foundation框架之--NSObject类

OC中的Foundation框架是系统提供的,他就相当于是系统的一套api,其内部有很多现有的类和功能提供给我们使用。

那么今天首先来介绍一下Foundation框架中的第一个类NSObject。

    //
    //  Person.h
    //  13_NSObjectMethod
    //
    //  Created by waterfoxjie 15-03-31.
    //  Copyright (c) 2015年 waterfoxjie. All rights reserved.
    //  

    #import <Foundation/Foundation.h>  

    @interface Person : NSObject  

    - (void)invoke;  

    @end
    //  Person.m
    //  13_NSObjectMethod
    //
    //  Created by waterfoxjie on 15-03-31.
    //  Copyright (c) 2015年 waterfoxjie. 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
    //  13_NSObjectMethod
    //
    //  Created by waterfoxjie on 15-03-31.
    //  Copyright (c) 2015年 waterfoxjie. All rights reserved.
    //  

    #import <Foundation/Foundation.h>  

    #import "Person.h"  

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

    int main(int argc, const charchar * 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方法

    //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中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是一样的。

equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其他对象类型,可以重写这个方法来进行操作)。

二、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{
    }  

这个方法的作用是判断一个指针变量指向的对象是不是属于一个类创建的。

三、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);
    }  

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

(1)无参数样式

[self performSelector:@selector(demo1)]  

(2)一个参数的样式

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

(3)两个参数样式

    //调用有两个参数的方法
    [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中的实现就简单了。

时间: 2024-10-25 04:50:50

黑马程序员--Foundation框架之--NSObject类的相关文章

黑马程序员--Foundation框架之--NSDirctionary类以及它的子类NSMutableDirctionary类

------IOS培训期待与您交流! ------- 今天来看一下Foundation框架中的NSDirctionary 类,NSMutableDirctionary类,OC中叫字典,字典是无序的,这个和NSArray不一样. 一.NSDirctionary类 1.创建方法 // 字典的创建 NSArray *array1 = [NSArray arrayWithObjects:@"zhangsan",@"zhangfei", nil nil]; NSArray *

黑马程序员--Foundation框架之--NSArray类以及它的子类NSMutableArray类

今天我们继续来看一下Foundation框架中的NSArray类和 NSMutableArray类,NSArray类 是不可变的,NSMutableArray类是可变的. 一.NSArray类 NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型.结构体放入到数组中得话,需要通过NSNumber/NSValue进行数据的封装 同时不能在NSArray中存储nil // // main.m // 16_NSArray // // Created by waterfoxjie

黑马程序员--Foundation框架之--NSString类以及它的子类NSMutableString类

继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样. 一.NSString对象 在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类. 下面来看一下NSString的一些方法的使用: 1.创建的方法 // 字符串的创建方式 NSString *s

黑马程序员——Foundation框架的小总结

一.Foundation框架—结构体 一.基本知识 Foundation框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了.即#import<foundation/foundation.h> 补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的. 二.常用的结构体介绍及简单使用 常用的结构体: (一)NSRang的基本使用

黑马程序员-Foundation框架之数组和字典

一.Foundation框架简介 Foundation框架,顾名思义就是基础框架.基础框架上的类都是与用户界面无关的,为所有的程序开发提供一个基础.OC的基础框架常用的类包括:数组,字典,数字,字符串等以及它们的子类.要使用这个框架需要在引入头文件#import <Foundation/Foundation.h> 二.数组 NSArray类以及它的子类NSMutableArray,一个是不可变数组,一个是可变数组.下面通过代码来看一下它的一些基本的用法. 1 #import <Found

黑马程序员--Foundation框架之--类其他常用的类:NSNumber,NSDate

------IOS培训期待与您交流! ------- Foundation的其他常用的类:NSNumber,NSDate 一.NSNumber 这个类主要是用来封装基本类型的,OC 中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去. 从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到. 1.封包和解包 // 创建NSNumber // 封包 NSNumber *intNumber = [NSNumber numberWithI

黑马程序员——Foundation框架常用类(NSDate)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 简介 NSDate:用于保存时间值的一个OC类,同时提供了一些方法来处理一些与时间相关的事.NSDate对象用来表示一个具体的时间点.NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体.NSDate存储的是GMT时间,使用的时候会根据 当前应用 指定的 时区 进行时间上的增减,以供计算或显示. NSDate 1.时间对象的基本使用 //第一种创建方式(里面存储

黑马程序员——Foundation框架常用类(NSNumber/NSValue)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 简介 引入:NSArray.NSSet.NSDictionary这些OC集合都只能存放OC对象,不能存放基本数据类型(int.char.double...).如果我们想将基本数据类型存到这些OC集合中,那么我们将基本数据类型(int.char.double...)包装成OC对象,那么就可以存到OC集合中.NSNumber可以将基本数据类型包装为OC对象. NSValue:用来存储一个C或者OC的

黑马程序员------Foundation框架中各种牛瓣数据类型

-----iOS培训.Android培训.Java培训,期待与您交流----- 一.NSRange.NSPoint\CGPoint. NSSize\CGSize.NSRect\CGRect (CGPint CGSize)结构体 1)NSRange NSRange表示一个范围,比如我们想求个@"I fall in love with Objective-C~";  这个字符串中"love"的表示范围就是位置从11开始,长度为4: NSRange的本质是一个结构体, 里