行业知识
iOS学习--类与对象(下)
2026-11-06 15:12:52
来源:互联网转载
文章目录
- 第六章
- 包装类
- 不是包装类
- NSValue和NSNumber
- 处理对象
- 打印对象和description方法
- == 和 isEqual方法
- 重写isEqual方法
- 总结
第六章
包装类
不是包装类
- NSInteger:大致等于long型整数。
- NSUInteger:大致等于unsigned long型整数。
- CGFLoat:在64位平台上大致等于double,在32位平台大致等于float。
这些并不是包装类。而是基本类型。
NSValue和NSNumber
都为包装类,NSValue是NSNumber的父类。NSValue代表更通用的包装类,NSNumber是更具体的包装类,主要包装C语言中的各种数据类型。主要包括三个方法
- +numberWithXxx:该类方法直接将特定类型的值包装成NSNumber。
- -initWithXxx:该实例方法需要先创建一个NSNumber对象,再用一个基本类型的值来初始化NSNumber
- -xxxValue:该实例方法返回该NSNumber对象包装的基本类型的值
下面展示一下实际用法:
#import #import "test.h"int main(int argc, const char * argv[]) { @autoreleasepool { NSNumber* num = [NSNumber numberWithInt: 20]; NSNumber* de = [NSNumber numberWithDouble: 3.4]; NSLog(@"%d", [num intValue]); NSLog(@"%g", [de doubleValue]); NSNumber* ch = [[NSNumber alloc] initWithChar:'J']; NSLog(@"%d", [ch charValue]); NSLog(@"%@", ch); }}处理对象
打印对象和description方法
默认情况下,description方法返回一个包含类名和内存地址的字符串,但通常不提供对象的详细信息。因此我们可以通过改写description方法,来实现打印对象的详细信息。实现返回
//这是.h#import @interface FKApple : NSObject@property (nonatomic, copy) NSString* color;@property (nonatomic, assign) double weight;- (id) initWithColor: (NSString*) color weight: (double) weight;@end//这是.m#import "FKApple.h"@implementation FKApple@synthesize color = _color;@synthesize weight = _weight;- (id) initWithColor:(NSString *)color weight: (double) weight{ if(self = [super init]) { self.color = color; self.weight = weight; } return self;}//重写description方法- (NSString*) description{ return [NSString stringWithFormat:@"",self.color, self.weight];}@end//这是主函数#import #import "FKApple.h"int main(int argc, const char * argv[]) { @autoreleasepool { FKApple* a = [[FKApple alloc] initWithColor:@"红色" weight:5.68]; NSLog(@"%@", a); }}上述代码通过对description方法对重写,实现了打印对象的具体信息。
这是未重写description时的输出。
这是重写description方法后的输出
== 和 isEqual方法
测试两个变量是否相等有两种方式,一个是利用==运算符,另一个是利用isEqual方法。
使用==来判断两个变量是否相等时,如果两个变量时基本类型的变量,且都是数值型,则只要两个变量的值相等,==判断就返回真。
对于两个指针类型的变量,他们必须指向同一个对象,即保存的内存地址相同时,==判断才会返回真。
注意:使用==比较类型上没有继承关系的两个指针变量时,编译器会提示警告。
int main(int argc, const char * argv[]) { @autoreleasepool { int it = 65; int fl = 65.0f; NSLog(@"65和65.0f是否相等?:%d", (it == fl)); char ch = 'A'; NSLog(@"65和'A是否相等?:%d",(it == ch));//将ch转化为ASCII值,再进行判断。 NSString* str1 = [NSString stringWithFormat:@"板栗"];//运行时创建,被保存在堆内存。因此str1和str2的内存地址不同。 NSString* str2 = [NSString stringWithFormat:@"板栗"]; NSLog(@"str1和str2是否相等?:%d",(str1 == str2));//0 NSLog(@"str1是否isEqual str2?:%d",[str1 isEqual:str2]);//1 NSString重写了isEqual方法,判断字符串相等的标准是:只要两个字符串所包含的字符序列相同,则返回真。 }}重写isEqual方法
重写isEqual方法可以实现按自定义的相等标准,来判断比较对象是否相同。下面提供一段代码进行解释。
//这是.h#import @interface FKUser : NSObject@property (nonatomic, copy) NSString* name;@property (nonatomic, copy) NSString* idStr;- (id) initWithName: (NSString*) name idStr: (NSString*) idStr;@end//这是.m#import "FKUser.h"@implementation FKUser@synthesize name = _name;@synthesize idStr = _idStr;-(id) initWithName: (NSString *) name idStr: (NSString *) idStr{ if(self = [super init]) { self.name = name; self.idStr = idStr; } return self;}- (BOOL) isEqual: (id) other//重写isEqual方法,将idStr是否相同作为判断依据{ if(self == other) { return YES; } if(other != nil && [other isMemberOfClass:FKUser.class]) { FKUser* target = (FKUser*) other; return [self.idStr isEqual: target.idStr]; } return NO;}@end//这是主函数#import #import "FKUser.h"int main(int argc, const char * argv[]) { @autoreleasepool { FKUser*p1 = [[FKUser alloc] initWithName:@"栗子" idStr:@"123123"]; FKUser*p2 = [[FKUser alloc] initWithName:@"板栗" idStr:@"123123"]; FKUser*p3 = [[FKUser alloc] initWithName:@"栗子" idStr:@"321321"]; NSLog(@"p1和p2是否相等?:%d",[p1 isEqual:p2]); NSLog(@"p1和p3是否相等?:%d",[p1 isEqual:p3]); }}//out:p1和p2是否相等?:1// p1和p3是否相等?:0上述代码即通过重写isEqual方法,实现根据判断对象中的idStr成员变量是否相同,来判断该对象是否相同。在这种判断标准下,我们认为只要两个对象的idStr相同,则判断相同。
重写isEqual有如下要求:
- 自反性:对任意x,[x isEqual:x]一定返回真
- 对称型:对任意x,y,如果[x isEqual:y]返回真,则[y isEqual:x]一定返回真
- 传递性:对任意x,y,z,如果有[x isEqual:y]返回真,[y isEqual:z]返回真,则[x isEqual:z]一定返回真
- 一致性:对任意x,y,如果对象中用于等价比较的关键信息没有改变,那么无论调用多少次[x isEqual:y],返回的结果应该保持一致
- 对任何不适nil的x,[x isEqual:nil]一定返回假
总结
摆烂一时爽,通宵补回来。谨以此告诫自己余下的时间好好补。
下一篇:IP风险画像有哪些应用?