从这篇文章开始我们开始介绍Foundation框架。

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

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

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

Person.h

  1. //
  2. //  Person.h
  3. //  13_NSObjectMethod
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject
  10. - (void)invoke;
  11. @end

Person.m

  1. //
  2. //  Person.m
  3. //  13_NSObjectMethod
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import "Person.h"
  9. @implementation Person
  10. - (void)invoke{
  11. NSLog(@"invoke is Executing...");
  12. [self demo1];//对象调用
  13. //performSelector方法调用
  14. NSString *result = [self performSelector:@selector(demo1)];
  15. NSLog(@"%@",result);
  16. //调用有一个参数的方法
  17. [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
  18. //调用有两个参数的方法
  19. [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
  20. //延迟调用一个方法
  21. //此处的延迟调用,代码不会停留在此处,为了不阻塞线程
  22. [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
  23. //如果没有以下代码的话,上面的延迟调用就不会有效果的,因为他不会阻塞当前线程,所以当前线程中后续的代码会继续执行
  24. //在main.m中得main方法中,会直接return,这样程序就运行结束了,所以来不及执行2.5s之后方法执行
  25. //以下代码让执行过程停在此处
  26. [[NSRunLoop currentRunLoop] run];
  27. }
  28. - (NSString *)demo1{
  29. NSLog(@"demo1");
  30. return @"demo1";
  31. }
  32. - (void)demo2:(NSString *)str{
  33. NSLog(@"str = %@",str);
  34. }
  35. - (void)demo3:(NSString *)str withName:(NSString *)name{
  36. NSLog(@"str = %@,name = %@",str,name);
  37. }
  38. @end

main.m

  1. //
  2. //  main.m
  3. //  13_NSObjectMethod
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. //isEqual判断两个指针是否指向同一个对象
  11. int main(int argc, const charchar * argv[]) {
  12. @autoreleasepool {
  13. //1.--------------------isEqual方法
  14. NSObject *obj1 = [[NSObject alloc] init];
  15. NSObject *obj2 = [[NSObject alloc] init];
  16. if([obj1 isEqual:obj2]){
  17. NSLog(@"obj1 == obj2");
  18. }else{
  19. NSLog(@"obj1 != obj2");
  20. }
  21. //或者直接用等号判断
  22. if(obj1 == obj2){
  23. //do something...
  24. }else{
  25. //do something...
  26. }
  27. //2.--------------------performSelector方法
  28. //调用invoke方法
  29. //延迟调用某一个方法
  30. Person *p = [[Person alloc] init];
  31. [p performSelector:@selector(invoke)];
  32. //3.--------------------isKindOfClass和isMemberOfClass方法
  33. Person *rose = [[Person alloc] init];
  34. //判断rose是否属于Person类创建的
  35. //BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
  36. BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
  37. if(isBelongTo == YES){
  38. }else{
  39. }
  40. //判断rose是否属于子类创建的
  41. //判断一个类是不是一个类的子类
  42. isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO
  43. //4.---------------------respondsToSelector方法
  44. //判断类中是否有特定的方法(有实现的方法全部返回YES,如果只在.h文件中定义了,返回的是NO)
  45. //同时这种方式可以实现调用所谓的私有方法
  46. Person *task = [[Person alloc] init];
  47. isBelongTo = [task respondsToSelector:@selector(invoke)];
  48. if(isBelongTo){
  49. }else{
  50. }
  51. }
  52. return 0;
  53. }

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

1、isEqual方法

  1. //1.--------------------isEqual方法
  2. NSObject *obj1 = [[NSObject alloc] init];
  3. NSObject *obj2 = [[NSObject alloc] init];
  4. if([obj1 isEqual:obj2]){
  5. NSLog(@"obj1 == obj2");
  6. }else{
  7. NSLog(@"obj1 != obj2");
  8. }
  9. //或者直接用等号判断
  10. if(obj1 == obj2){
  11. //do something...
  12. }else{
  13. //do something...
  14. }

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

2、isMemberOfClass方法

  1. //3.--------------------isKindOfClass和isMemberOfClass方法
  2. Person *rose = [[Person alloc] init];
  3. //判断rose是否属于Person类创建的
  4. //BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
  5. BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
  6. if(isBelongTo == YES){
  7. }else{
  8. }

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

3、isKindOfClass方法

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

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

4、respondsToSelector方法

  1. //4.---------------------respondsToSelector方法
  2. //判断类中是否有特定的方法(有实现的方法全部返回YES,如果只在.h文件中定义了,返回的是NO)
  3. //同时这种方式可以实现调用所谓的私有方法
  4. Person *task = [[Person alloc] init];
  5. isBelongTo = [task respondsToSelector:@selector(invoke)];
  6. if(isBelongTo){
  7. }else{
  8. }

这个方法我们在之前的文章中使用过了,他的作用就是判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES

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

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

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

这个方法的功能如果在Java中可以使用反射去实现

5、performSelector方法

  1. - (void)invoke{
  2. NSLog(@"invoke is Executing...");
  3. [self demo1];//对象调用
  4. //performSelector方法调用
  5. NSString *result = [self performSelector:@selector(demo1)];
  6. NSLog(@"%@",result);
  7. //调用有一个参数的方法
  8. [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
  9. //调用有两个参数的方法
  10. [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
  11. //延迟调用一个方法
  12. //此处的延迟调用,代码不会停留在此处,为了不阻塞线程
  13. [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
  14. //如果没有以下代码的话,上面的延迟调用就不会有效果的,因为他不会阻塞当前线程,所以当前线程中后续的代码会继续执行
  15. //在main.m中得main方法中,会直接return,这样程序就运行结束了,所以来不及执行2.5s之后方法执行
  16. //以下代码让执行过程停在此处
  17. [[NSRunLoop currentRunLoop] run];
  18. }
  19. - (NSString *)demo1{
  20. NSLog(@"demo1");
  21. return @"demo1";
  22. }
  23. - (void)demo2:(NSString *)str{
  24. NSLog(@"str = %@",str);
  25. }
  26. - (void)demo3:(NSString *)str withName:(NSString *)name{
  27. NSLog(@"str = %@,name = %@",str,name);
  28. }

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

无参数样式

  1. [self performSelector:@selector(demo1)]

一个参数的样式

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

两个参数样式

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

但是我们看到上面的调用方式,感觉不到这个方法的用途,因为我们完全可以直接调用demo1方法

  1. [self demo1]

在看看他的一种样式

  1. //延迟调用一个方法
  2. //此处的延迟调用,代码不会停留在此处,为了不阻塞线程
  3. [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];

可以延迟的调用一个方法,这才是该方法的核心作用,他的作用类似于Android中的postDelayed(Runnable runable)方法,同样,这个方法会在后面UI使用中经常使用到,能够延迟的调用一个方法。

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

  1. Person *task = [[Person alloc] init];
  2. isBelongTo = [task respondsToSelector:@selector(demo1)];
  3. if(isBelongTo){
  4. [task performSelector:@selector(demo1)];
  5. NSLog(@"YES");
  6. }else{
  7. NSLog(@"NO");
  8. }

他回经常结合respondsToSelector方法一起使用,这里demo1就是一个私有的方法,如果在Java中需要用到反射,然后还要强暴一下这个私有方法才能调用。在OC中的实现就简单了。

总结

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

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

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

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  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. es6 --- var const let

    var  const   let  区别 今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1. const ...

  2. ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  3. 使用spring-boot 国际化配置所碰到的乱码问题

    写好html静态页面 ,  也加上了编码格式 , 获取国际化展示在浏览器中还是存在乱码 , 开始以为是浏览器编码格式问题 , 做过处理后任没有得到解决 , 具体的处理方案如下: <meta ht ...

  4. Java表单设计器orbeon点滴

    包含表单设计器和运行展现 一个完整的应用 页面部分都是使用XML和XHTML进行服务端的组合出来的,具体逻辑有些复杂 设计器缺少一个最常用的:repeat,如果需要只能手动编写代码(参考官方文档步骤有 ...

  5. cocos2dx-js学习笔记(一)环境搭建

    本人眼下的学习方向是cocos2dx+js的开发方式,开发调试使用webstrom和火狐浏览器,调试完毕的项目使用cocos2dx+jsb的方式编译到PC或android设备执行.主要时间用在学习,所 ...

  6. 小白学开发(iOS)OC_ block数据类型(2015-08-08)

    // //  main.m //  block数据类型 // //  Created by admin on 15/8/12. //  Copyright (c) 2015年 admin. All r ...

  7. thinkphp事务处理以及无效时的解决方案(整理)

    thinkphp事务处理以及无效时的解决方案(整理) 一.总结 一句话总结:要程序里面支持事务,首先连接的数据库和数据表必须支持事务 mysql 1.InnoDB和MyISAM对事务的支持怎么样? I ...

  8. STL中向量vector笔记

    vector的本质是:数组的封装 特点:读取能在常数时间内完成 Vector成员函数 函数 表述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数 ...

  9. 基于jQuery的一组图片的滚动

    css: .displayB{display:block;}.fl{float:left;}.fr{float: right;}.posAb{position: absolute;}.posRe{po ...

  10. Java Web学习总结(1)——JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...