小工具知识网

当前位置: 首页 > 行业知识 > iOS学习--类与对象(下)

行业知识

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风险画像有哪些应用?