一起Talk IOS吧(第二十四回 OC中的根类NSObject)

2024-03-12 03:48

本文主要是介绍一起Talk IOS吧(第二十四回 OC中的根类NSObject),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

看官们,我们在前面章回中介绍面向对象的知识时总有一个绕不开的内容:NSObject,本章回中将详细它。

在OC中,NSObject是所有类的根类,这点我们在前面章回中的示例代码中可以看到,作为根类它提供了一些最基础的功能:

初始化,输出类中成员的明细和比较对象是否相同.

这些功能通过具体的方法来体现,它们是:init, description,isEquals.接下来我们详细分析如何使用这三个方法。

  • init方法用来做初始化,如果有专门的内容需要初始化,那么就重写此方法,否则直接使用父类的方法就可以;
  • description方法用来输出类中成员的明细,如果不重写此方法默认输出对象地址,另外输出的明细有专门的格式,参考示例代码就可以;
  • isEquals用来比较对象是否相等,默认情况下比较两个对象的地址是否相等,子类中一定要重写此方法,不然会得到错误的结果;

下面我们通过具体的代码来演示如何使用这些方法:

#import<Foundation/Foundation.h>@interface Phone : NSObject@property NSString *name;
@property int size;-(void) show;@end@implementation Phone 
@synthesize name;
@synthesize size;-(instancetype) init {self = [super init];if(self) {name = @"This is Phone";size = 123;}return self;
}-(void) show {NSLog(@"name: %@, size: %d ",name,size);
}-(NSString*) description {return [NSString stringWithFormat:@"<Phone[name=%@,size=%d]>",name,size];}-(bool) isEquals: (id) object {bool result = NO;if(self != nil && object == nil)return result;if(self == object)return YES;if([name isEqualToString:[object name]] && size == [object size])result = YES;return result;}@endint main() {Phone *p1 = [[Phone alloc] init];Phone *p2 = [[Phone alloc] init];Phone *p3 = [[Phone alloc] init];Phone *p4 = p1;[p1 setName:@"this is p1"];[p2 setName:@"this is p2"];[p3 setName:@"this is p1"];NSLog(@"OBJ:%@",[p1 description]);NSLog(@"OBJ:%@",[p2 description]);NSLog(@"OBJ:%@",[p3 description]);NSLog(@"OBJ:%@",[p4 description]);if([p1 isEquals:p2])NSLog(@"p1 == p2");elseNSLog(@"p1 != p2");if([p1 isEquals:p3])NSLog(@"p1 == p3");elseNSLog(@"p1 != p3");if(p1 == p3)NSLog(@"p1 == p3");elseNSLog(@"p1 != p3");if([p1 isEquals:p4])NSLog(@"p1 == p4");elseNSLog(@"p1 != p4");if(p1 == p4)NSLog(@"p1 == p4");elseNSLog(@"p1 != p4");
}

在代码中,我们定义了Phone类,它继承自NSObject,包含两个属性和一个方法;实现该类的时候,除了实现类自己的方法:Show外,它还实现了父类中的三个方法。接下来我们依次分析这三个方法的实现思路:

  • init方法首先调用了父类的init方法,然后初始化类的两个属性,最后返回初始化后的对象;
  • description方法用来输出类中成员的明细,代码中使用了固定的格式字符串来输出明细;
  • isEquals用来比较对象是否相等,我们提供的实现中先比较对象的地址是否相等,如果地址相等那么两个对象肯定相等。 如果地址不相等,那么再比较对象的属性值是否相等,此时,如果两个对象的属性值都相等,那么这两个对象相等。

最后,我们在main方法来使用这三个方法。首先创建了p1,p2,p3,p4四个Phone类型的对象,这其中使用了Phone类的init方法.接着在代码中使用description方法分别输出了这四个对象的内容,从对象的内容上看,只有p2的内容和其它几个对象的内容不一样。由此可见p1,p3,p4这三个对象是相等的,在接下来的代码中使用isEquals方法进行了验证。下面是程序的运行结果,请大家参考:

  1  ex.out[2901:62466] OBJ:<Phone[name=this is p1,size=123]>2  ex.out[2901:62466] OBJ:<Phone[name=this is p2,size=123]>3  ex.out[2901:62466] OBJ:<Phone[name=this is p1,size=123]>4  ex.out[2901:62466] OBJ:<Phone[name=this is p1,size=123]>5  ex.out[2901:62466] p1 != p26  ex.out[2901:62466] p1 == p37  ex.out[2901:62466] p1 != p38  ex.out[2901:62466] p1 == p49  ex.out[2901:62466] p1 == p4

从程序的运行结果中可以看到,程序对各个对象是否相等的判断结果和我们人工判断的结果保持一致。另外,在程序中我们为了突出重写isEquals方法的重要性,我们使用==来判断两个对象是否相等,该运算符只能判断两个对象的地址是否相等,也就是说它和isEquals方法默认的判断方法相同,从运算结果中的第7行可以看到,如果不重写isEquals方法,程序会认为p1与p3不相等,这显然不符合实际情况,我们从运行结果的第1行和第3行可以看到p1和p3是相等的。

最后,我们对本章回的内容做一个总结:

  • 1.OC中所有类的根类为NSObject;
  • 2.NSObject类提供了三个方法:init, description,isEquals.
  • 3.init方法用来初始化类中的各种属性;
  • 4.description方法用来输出类中成员的明细;
  • 5.isEquals用来比较对象是否相等,而不是使用等号来比较;
  • 6.我们在定义的类的时候最好重写最后两个方法,第一个方法可以依据类的属性来决定是否重写;

看官们,欲知后事如何且听下回分解!

这篇关于一起Talk IOS吧(第二十四回 OC中的根类NSObject)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800060

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑