zoukankan      html  css  js  c++  java
  • containsObject 总是不含有,你会用吗

    结论:containsObject:是在比较内存地址,即使两个对象内容完全一样,地址不同,那也是不同的。我个人认为这个方法应该叫是否存在同一个对象

    (开始不知道这个知识,被坑,至少浪费了3个钟头,数组里对象内容一样,就是不包含这个对象,MMP,自己无知怪谁呢)

           Person中包含name和age,分别表示名字和年龄,数组中包含多个Person,我们的目的是,如果数组中存在同样的人名,并且年龄完全相同,就舍弃新的Person,如何实现这个需求呢?我们需要重载isEqual方法。

    Person.h

    @interface Person : NSObject

    @property NSString *name;

    @property NSInteger age;

    @end

    Person.m 

    @implementation Person

    - (BOOL)isEqualToPerson:(Person *)person {

        if (!person) {

            return NO;

        }

        BOOL bIsEqualNames = (!self.name && !person.name) || [self.name isEqualToString:person.name];

        BOOL bIsEqualAges = self.age == person.age;

        return bIsEqualNames && bIsEqualAges;

    }

     

    #pragma mark - 重载isEqual方法

    - (BOOL)isEqual:(id)object {

        if (self == object) {

            return YES;

        }

        

        if (![object isKindOfClass:[Person class]]) {

            return NO;

        }

        return [self isEqualToPerson:(Person *)object];

    }

    @end


    viewController里调用时: 

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        

        Person *A = [[Person alloc]init];

        A.name=@"zhangsan";

        A.age=18;

        

        Person *B = [[Person alloc]init];

        B.name=@"lisi";

        B.age=15;

        

        NSMutableArray *aArray = [[NSMutableArray alloc]init];

        [aArray addObject:A];

        [aArray addObject:B];

        

        Person *C = [[Person alloc]init];

        C.name=@"zhangsan";

        C.age=18;

        

        NSLog(@"%ld",[aArray containsObject:C]);

        

    }

    最终结果,打印1,证明aArray里含有了一个姓名为zhangsan、年龄为18的人。因为Person.m里的两个方法,声明了只要姓名和年龄内容相同,就认为是同一个人。

    如果注释掉Person.m里的两个方法,会打印0,因为系统默认的containsObject,比较对象的内存地址,C和A内存地址不一样,所以默认会被认为不含有C,而含有A。

  • 相关阅读:
    《第一行代码》阅读笔记(十四)——ViewPager
    《第一行代码》阅读笔记(十三)——碎片的最佳案例
    《第一行代码》阅读笔记(十二)——探究碎片
    《第一行代码》阅读笔记(十一)——编写界面的最佳案例
    《第一行代码》阅读笔记(十)——RecyclerView
    《第一行代码》阅读笔记(九)——ListView
    《第一行代码》阅读笔记(八)——自定义控件
    《第一行代码》阅读笔记(七)——Android经典四种布局
    《第一行代码》阅读笔记(六)——AndroidUI控件(初级)
    后台管理系统左侧菜单栏显示隐藏
  • 原文地址:https://www.cnblogs.com/huangzs/p/11219235.html
Copyright © 2011-2022 走看看