OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍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 0;
- }
下面来一一介绍一下方法的作用
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对象的更多相关文章
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...
- (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...
- (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...
- OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...
- OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...
- OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...
随机推荐
- RTSP传输协议之Methods总结
RTSP/1.0 200 OK Server: DSS/5.5.5 (Build/489.16; Platform/Linux; Release/Darwin; state/beta; ) Cseq: ...
- BZOJ 4582 贪心
思路: 显然是个贪心 排个序 然后扫几遍就好了 (重叠的区间不能取) //By SiriusRen #include <cstdio> #include <algorithm> ...
- POJ 1989 贪心
题意: 思路: 从前到后扫一遍 如果k个数都出现过了 ans++ 从当前接着判断 最后答案就是ans+1 //By SiriusRen #include <cstdio> using na ...
- BZOJ 2037 区间DP
跟POJ 3042是一个类型的http://blog.csdn.net/qq_31785871/article/details/52954924 思路: 先排个序 (把初始位置也插进去) f[i][j ...
- Day2上午解题报告
预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...
- 分享一个vue常用的ui控件
vue学习文档 http://www.jianshu.com/p/8a272fc4e8e8 vux github ui demo:https://github.com/airyland/vux M ...
- OpenCV —— 直方图与匹配
直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据中计算出来的特征的统计量,这些数据可以是诸如梯度,方向,色彩或任何其他特征. 直方图获得是是数据分布的统计图 ...
- 抓包神器Fiddler之Https请求随心转
随着AppleStore对APP的审核越来越严格,客户端请求服务端API的方式大多数都变更为了https,在更安全的同时又引起了另外一个问题——本地抓包开发调试的不便. 一般来说,我们在开发API的时 ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
Util.java,使用最广泛~代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util; import java.io.Fil ...
- 企业网管软件之SOLARWINDS实战-制作拓扑图
企业网管软件之SOLARWINDS实战-制作拓扑图-开始 企业网管软件之SOLARWINDS实战-制作拓扑图 本文出自 "李晨光原创技术博客" 博客,谢绝转载!