我试图比较Objective-C中的对象,只是徘徊如何,例如,两个对象(这是UIView的实例)被比较,保存两个nsstring,像这样:
#import <Foundation/Foundation.h>
@interface Notebook : UIView
{
NSString *nameOfBook;
NSString *colourOfBook;
}
@property (nonatomic, retain) NSString *nameOfBook;
@property (nonatomic, retain) NSString *colourOfBook;
让我们假设我有两个nsmutablearray,其中包含几个类型为Notebook的对象。一个叫现实,另一个叫理论。现实中有两个名为@"Lectures"
和@"Recipies"
的笔记本,但是colorrofbook都是空的。理论持有三个笔记本,名称为:book @"Lectures"
, @"Recipies"
, @"Zoo"
, colorrofbook @"red"
, @"yellow"
, @"green"
。
我想比较一下这两个数组,并根据实际调整理论。在本例中,它意味着删除@"Zoo"
。我不能简单地用现实代替理论,因为那样的话,我就失去了理论所储存的所有色彩。
这是我想出来的代码:
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"的对象相同。
我怎样才能实现根据对象的一个属性(在这种情况下是名称)来比较对象?
如果你阅读indexOfObject:的文档,你会发现NSArray对数组中的每个对象调用isEqual:。所以,为Notebook重写isEqual并实现你自己的比较例程。
说到这里,你为什么不初始化一个Notebook的实例,用一个自动释放的实例覆盖它,然后释放它?(没关系,你可能会先在循环中释放它!)你注定要撞车。为什么在迭代数组时要从数组中删除对象?
您希望实现像-isEqual:
这样的方法。