文章目录
包装类
OC是一门面向对象的编程语言,对于c语言的(short , int, float, double)等基本数据类型来说都不是对象,他们也不具备对象的特征–因此我们可以通过一包装类来他们具有对象的属性;
OC的包装类
非包装类
在看书的时候遇到了如下三种类型
- NSInteger :大致等于long型整数
- NSUInteger:大致等于 unsigned long 整数
- CGFLoat:基于64/32位-double/float
尽管这三个类型前面有NS,CG但是他们并不是包装类,他们是基本类型
包装类
NSValue
-NSValue 和 NSNumber 都是包装类,其中 NSvalue 是 NSNumber 的父类
- NSValue 代表一个更通用的包装类,它可用于包装单个 short、int、 long、 nloat、char、指针、对象id 等数据项,通过该包装类,就可以把short、int、long、float、char、指针等添加到 NSArray、NSSet 等集
合(这些集合要求它们的元素必须是对象); - NSNumber 是更具体的包装类,主要用于包装C 语言的各种数值类型,NSNumber 主要包括如下了类方法
NSNumber用法
- numberWithxxx:该类方法直接将特定类型的值包装成 NSNumber。
- init Withxxx::该实例方法需要先创建一个 NSNunber 对象,再用一个基本类型的值来初始化 NSNumber.
- xxxValue:该实例方法返回该 NSNumber 对象包装的基本类型的值
上面3个用法中的xxx 可以代表 int、char 等各种基本类型
包装实例
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 调用类方法将int类型的值包装成NSNnumber的对象
NSNumber *num = [NSNumber numberWithInt:20];
// 调用类方法将double 类型的值包装成NSNumber对象
NSNumber *num1 = [NSNumber numberWithDouble:7.7];
NSLog(@"[NSNumber numberWithInt设置的数字是%d", [num intValue]);
NSLog(@"[NSNumber numberWithIDouble设置的数字是%g", [num1 doubleValue]);
//initWith方法
//1. 先创建NSNnumber对象 在调用initWithXxx方法初始化
NSNumber *ch = [[NSNumber alloc] initWithChar:'M'];
NSLog(@"%@", ch);
}
return 0;
}
结果
2022-05-21 12:56:49.181809+0800 OC包装类和处理对象[4935:687060] [NSNumber numberWithInt设置的数字是20
2022-05-21 12:56:49.182027+0800 OC包装类和处理对象[4935:687060] [NSNumber numberWithIDouble设置的数字是7.7
2022-05-21 12:56:49.182051+0800 OC包装类和处理对象[4935:687060] 77
Program ended with exit code: 0
上面的代码简单看出:将基本类型转化成包装类的做法就是调用numberWithXxxx类方法,调用该方法时候穿入一个基本类型的值,若需要从包装类实例获取该基本类型的值 用xxxValue 即可
处理对象
OC的对象都是NSObject的子类实例,都可以直接调用该类中定义的方法,也就是这些方法提供了处理OC对象的通用方法
打印对象的description方法
NSLog0函数不仅可用于输出基本类型的值,也可用于输出 Objective-C对象,当使用NSLOg0函数输出 Objective-C 对象时,输出的是该对象的 description 方法的返回值。也就是说,下面两行代码的效果完全一样(假设p是指向任何对象的指针变量)。
NSLog(@"%@",p)
NSLog(@"%@", [p description]);
-
description 方法是 NSObjec类的一个实例方法,所有的 Objective-C 类都是 NSObject -子类,因此,所有的 Objective-C 对象都具有 description 方法。
description 方法是一个非常特殊的方法,它是一个“自我描述,方法,该方法通常s实现这样一个功能:当程序员直接打印该对象时,系统将会输出该对象的…自我描述”信息,用以告诉外界该对象具有的状态信息。 -
NSObject 类提供的 description 方法总是返回
<FKPerson:十六进制的首地址>
== 和 isEqual方法
在 OC程序测试中判断测试两个变量是否相等有2
种方式一种是==运算符
另一种isEqual方法
== 方法
- 当用 ”== “来判断两个变量是否相等时,如果是基本类型的变量且都是数值型,则只要两个变量的值相等,那么==判断返回1
- 对于两个指针类型的变量,他们必须指向同一个对象当两个指针变量保存的内存地址相同的时候判断返回真,否则编译器会提示警告。
isEqual 方法
其实很多时候我们并不是要判断两个指针变量是否想等 我们也许会需要判断 值相等的判断规则,此时我们就可以利用NSString 对象的isEqual 方法来判断
- NSString 对象的isEqual 已经被重写了,NSString 对象的isEqual 方法判断两个字符串是否相等的标准是:只要两个字符出串包含的字符序列相同 该方法比较换回真 否则返回假
重写isEqual 方法的要求
通常而言,正确地重写 isEoual:方法应该满足下列条件:
- 自反性:对任意x,[x isEqual:x]一定返回真。
- 对称性:对任意× 和y,如果ly isEqual :×返回真,则[x isEqual:y]也返回真。
- 传递性:对任意x、y、z如果有x isEqual:y]返回真,Ly isEqual:2返回真,则(x isEqual:z]一定返回真。
- 一致性:对任意× 和y,如果对象中用于等价比较的关键属性没有改变,那么无论调用(x isEqual:y]多少次,返回的结果都应该保持一致,要么一直是真,要么一直是假。
对任何不是nil的x, [x isEqual: ni]一定返回假
isEqual 方法什么时候需要重写
- NSObject 默认提供的 isEqval:只是比较对象的地址,即 NSObject 类的 isEqual:方法比较的结果与一=运算符比较的结果完全相同。因此,在实际应用中常常需要重写 isEqual:方法,
- 重写 isEqual:方法时,等价条件是由业务要求决定的,因此,isEqual:方法的实现也由实际要求来决定。
NSString的- isEqualToString方法
在以后的iOS 开发中,还会看到程序中使用 isEqualToString:方法来判断两个宇
符串相等的代码。,
实际上,NSString 不仅重写了 isEqual:方法,用于判断两个宇符
串的字符序列是否相等,还定义了一个 isEqualToString:方法,该方法专门用于判断当前字符串与另一个字符串的序列是否相等在此不过多赘述