在Objective-C中比较对象

3

我正在尝试比较Objective-C中的对象,想知道如何比较两个包含两个NSString的对象(这些对象是UIView的实例):

    #import <Foundation/Foundation.h>

    @interface Notebook : UIView
    {
        NSString *nameOfBook;
        NSString *colourOfBook;

    }

    @property (nonatomic, retain) NSString *nameOfBook;
    @property (nonatomic, retain) NSString *colourOfBook;

假设我有两个NSMutableArrays,它们都保存了多个Notebook对象。其中一个名为reality,另一个名为theory。Reality包含两个名为nameOfBook的笔记本,分别是@"Lectures"和@"Recipies",但它们的colorOfBook属性都为空。Theory包含三个名为nameOfBook的笔记本,分别是@"Lectures"、@"Recipies"和@"Zoo",而colorOfBook属性则是@"red"、@"yellow"和@"green"。
我想比较这两个数组并根据reality调整theory。在这种情况下,这意味着删除@"Zoo"。我不能简单地用reality替换theory,因为这样会丢失theory中存储的所有颜色。
以下是我想出的代码:
    for (int i=0; i < [theory count]; i++) {

    Notebook *testedNotebook = [Notebook alloc];
    testedNotebook = [theory objectAtIndex:i];

    if ([reality indexOfObject:testedNotebook] == NSNotFound)
    {
        NSLog(@"Book is not found in reality - remove it from theory...");
        [theory removeObject:testedNotebook];
    }

    [testedNotebook release];

}

现在,我的一个大问题是如何比较这些对象。理想情况下,我希望仅比较它们的名称而不考虑颜色。但我猜现在我的代码并不是这样工作的。整个对象被比较,实际上包含 @"Lectures" 和 @""(无颜色)的对象与理论上包含@"Lectures"和@"red"的对象不能相同。
我该如何实现根据对象属性之一(在本例中是名称)进行比较呢?
2个回答

3
如果你阅读indexOfObject:的文档,你会发现NSArray对数组中的每个对象调用isEqual:。因此,覆盖Notebook的isEqual方法并实现自己的比较程序。
顺便问一下,为什么你要分配一个未初始化的Notebook实例,然后用自动释放的实例覆盖它,最后释放它?(别管你可能在循环中首先释放它!)你注定会崩溃。而且为什么你要在迭代过程中从数组中删除对象?

我想你说得对,我应该再仔细考虑一下。感谢你的意见! - n.evermind
希望我在“与无关事项相关”的评论中没有过于强硬。 :) - Extra Savoir-Faire
1
我会非常小心地覆盖-isEqual:方法,特别是针对UIView这样的子类。UI框架可能依赖于不同实例的UIView比较不相等。此外,如果您覆盖了-isEqual:方法,则必须确保-hash方法是一致的。请参阅http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/20000052-BBCCECDG中的文档。 - JeremyP

2

您希望实现像 -isEqual: 这样的方法。请参阅此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接