前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架。

OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用。那么今天首先来介绍一下Foundation框架中的第一个类NSObject。

在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用,比如我们经常使用的alloc和init方法,就是NSObject提供的,下面就在来看一下他的一些其他常用方法:

通过代码来演示每个方法的作用:

Person.h

 //
// 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 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 ;
}

下面来一一介绍一下方法的作用:

1、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中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是一样的,但是在Java中是不同的,Java中的"=="是判断两个引用变量是否指向同一个对象,但是其equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其他对象类型,可以重写这个方法来进行操作)。

2、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效果。

3、isKindOfClass方法

 //判断rose是否属于子类创建的
//判断一个类是不是一个类的子类
isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO

这个方法的作用是判断一个指针变量指向的对象是不是一个类的子类,类似于Java中的instanceof关键字的作用。

4、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中可以使用反射去实现。

5、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对象中的一些常用方法。

(转载)OC学习篇之---Foundation框架中的NSObject对象的更多相关文章

  1. OC学习篇之---Foundation框架中的NSObject对象

    从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...

  2. (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...

  3. OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...

  4. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  5. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  6. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...

  7. OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...

  8. OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...

  9. OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...

随机推荐

  1. J2EE如何生成验证码图片和点击刷新验证码

    验证码图片生成步骤 创建BufferedImage对象. 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象. 调用Graphics对象的setColo ...

  2. ubuntu装机后的一些零散配置

    -2 以root用户登录 su passwd root 可参考http://blog.csdn.net/happyteafriends/article/details/7518893 : 先设定一个r ...

  3. PowerDesigner15.1创建模型及生成带注释sql操作手册

    转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...

  4. 命令 tar & zip

    安装zip yum install -y unzip zip: tar-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解 ...

  5. 《c程序设计语言》读书笔记--统计 行数、单词数、字符数

    #include <stdio.h> int main() { int lin = 0,wor = 0,cha = 0; int flag = 0; int c; while((c = g ...

  6. C#的运算符重载

    运算符重载看起来与标准静态方法声明类似,但它们使用关键字operator和运算符本身,而不是一个方法名: public static 返回类型 operator +(类型1 变量1,类型2 变量2) ...

  7. innodb锁之间的兼容性判断

    检查锁与锁之间的兼容性 路径:/mysql-5.5.43/storage/innobase/lock/lock0lock.c 实现:见锁的强度比较  row 可理解为 lock 的锁模式  colum ...

  8. java中进程与线程的三种实现方式

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指 ...

  9. echarts地图点定位的问题

    1,生成地图 2,如果需要产生地图上的点位,需要在配置中传入geoCoord具体数据为一下: { "海门": [121.15, 31.89], "鄂尔多斯": ...

  10. UVa 11988 (数组模拟链表) Broken Keyboard (a.k.a. Beiju Text)

    题意: 模拟一个文本编辑器,可以输入字母数字下划线,如果遇到'['则认为是Home键,如果是']'则认作End键. 问最终屏幕上显示的结果是什么字符串. 分析: 如果在数组用大量的移动字符必然很耗时. ...