注意:以下SO问题是相关的,但它们和链接资源似乎都没有完全回答我的问题,特别是在实现对象集合的相等性测试方面.
NSObject提供默认实现-hash(返回实例的地址,如(NSUInteger)self)和-isEqual:(NO除非接收者的地址和参数相同,否则返回).这些方法旨在根据需要进行覆盖,但文档清楚地表明您应该同时提供这两种方法,或者两者都不提供.此外,如果-isEqual:返回YES两个对象,那么-hash这些对象的结果必须相同.如果不是这样,当应该相同的对象(例如两个-compare:返回的字符串实例)NSOrderedSame被添加到Cocoa集合或直接比较时,就会出现问题.
我开发了CHDataStructures.framework,这是一个Objective-C数据结构的开源库.我已经实现了许多集合,目前正在改进和增强其功能.我想要添加的功能之一是能够将集合与另一个集合进行比较.
这些比较不应仅比较内存地址,而应考虑两个集合中存在的对象(包括排序,如果适用).这种方法在Cocoa中具有相当先例,并且通常使用单独的方法,包括以下方法:
-[NSArray isEqualToArray:]-[NSDate isEqualToDate:]-[NSDictionary isEqualToDictionary:]-[NSNumber isEqualToNumber:]-[NSSet isEqualToSet:]-[NSString isEqualToString:]-[NSValue isEqualToValue:]我想使我的自定义集合对于相等性测试具有鲁棒性,因此可以安全地(并且可预测地)将它们添加到其他集合中,并允许其他集合(如NSSet)确定两个集合是否相等/等同/重复.
一个-isEqualTo...:方法本身很有用,但是定义这些方法的类通常也会覆盖-isEqual:调用,[self isEqualTo...:]如果参数与接收者属于同一个类(或者可能是子类),或者[super isEqual:]不是.这意味着类还必须定义-hash,以便为具有相同内容的不同实例返回相同的值.
此外,Apple的文档-hash规定如下:(强调我的)
"如果一个可变对象被添加到使用的散列值,以确定该对象的集合中的位置的集合,由对象的哈希方法返回的值不能而所述对象是所述集合中的变化.因此,任一散列法不能依赖于对象的任何内部状态信息,或者必须确保对象在集合中时对象的内部状态信息不会发生变化.因此,例如,可变字典可以放在哈希表中但是你必须当它在那里时不要改变它.(注意,很难知道给定对象是否在集合中.)"
编辑: 我明白为什么这是必要的并完全同意推理 - 我在这里提到它提供额外的背景,并为了简洁而避开了为什么会这样的主题.
我的所有集合都是可变的,并且散列必须至少考虑一些内容,因此这里唯一的选择是将其视为编程错误来改变存储在另一个集合中的集合.(我的集合都采用NSCopying …
我需要一种方法来传递属性并获取分配给它的名称.有什么建议?
@property (nonatomic, retain) MyObject *crazyObject;
NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject);
// Above method should return @"crazyObject"
Run Code Online (Sandbox Code Playgroud) introspection objective-c objective-c-runtime declared-property
如何比较自定义类的两个对象?我的想法是在类中添加一个额外的方法,我可以在其中将当前对象与同类的另一个对象进行比较.
所以我可以编写自己的代码,比较每个类的字段.
我就是这样做的.或者有一些预定义的方法来做到这一点?像NSString类的"isEqualTo"?
我有两个NSMutableArray填充数据对象.如果发现任何更改,如何比较数组和合并.
例如:
Array1= index(0) userName = {'a',1,'address'}
index(1) userName = {'b',2,'address'}
Array2= index(0) userName = {'c',3,'address'}
index (1) userName = {'b',2,'address'}
结果是:
Array= index(0) userName = {'a',1,'address'}
index (1) userName = {'b',2,'address'}
index(2) userName = {'c',3,'address'}
请帮忙
我有一个关于xcode编码的简单问题,但不知道为什么事情没有像我想的那样表现.我有一个对象数组(自定义对象).我只想检查这个是否在数组中.我使用了以下代码:
NSArray *collection = [[NSArray alloc] initWithObjects:A, B, C, nil]; //A, B, C are custom "Item" objects
Item *tempItem = [[Item alloc] initWithLength:1 width:2 height:3]; //3 instance variables in "Item" objects
if([collection containsObject:tempItem]) {
NSLog(@"collection contains this item");
}
Run Code Online (Sandbox Code Playgroud)
我想上面的检查会给我一个积极的结果,但事实并非如此.此外,我检查了创建的对象是否相同.
NSLog(@"L:%i W:%i H:%i", itemToCheck.length, itemToCheck.width, itemToCheck.height);
for (int i = 0, i < [collection count], i++) {
Item *itemInArray = [collection objectAtIndex:i];
NSLog(@"collection contains L:%i W:%i H:%i", itemInArray.length, itemInArray.width, itemInArrayheight);
}
Run Code Online (Sandbox Code Playgroud)
在控制台中,这是我得到的:
L:1 W:2 H:3
collection contains L:0 W:0 H:0 …Run Code Online (Sandbox Code Playgroud) 我是Objective-C的新手,我正在寻找处理原始浮点数的最佳方法,并在Objective-C类中实现-hash方法时加倍.在这个问题中,我已经找到了关于isEqual和hash的一些好建议:
但它没有说明如何处理花车和双打.
我最好的尝试:
...
long lat = [[NSNumber numberWithDouble:self.latitude] longValue];
result = prime * result + (int) (lat ^ (lat >>> 32));
...
Run Code Online (Sandbox Code Playgroud)
但我不确定这是正确的方法.有任何想法吗 ?
我有一个包含一些自定义对象的NSMutableArray.其中两个对象具有相同的属性,如标题和作者.我想删除重复的对象,然后离开另一个.
Asset *asset;
NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
// First
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
// Second
asset = [[Asset alloc] init];
asset.title = @"Writer";
asset.author = @"Steve Johnson";
[items addObject:asset];
[asset release];
// Third
asset = [[Asset alloc] init];
asset.title = @"Developer";
asset.author = @"John Smith";
[items addObject:asset];
[asset release];
Run Code Online (Sandbox Code Playgroud)
由于它们不是同一个对象,但只有重复属性,我该如何删除副本?
所以我重写isEquals并hash比较自定义对象,以便能够删除重复项NSArray.问题是我在列表中缺少一些不包含重复项的值,而且我的hash或isEquals实现似乎是错误的.自定义对象是具有像一些变量课程目标:id和name我会在这里把代码:
- (BOOL)isEqual:(id)object {
if ([object isKindOfClass:[Course self]]) {
return YES;
}
if(self == object){
return YES;
}
else {
return NO;
}
}
- (unsigned)hash {
NSString *idHash = [NSString stringWithFormat: @"%d", self._id];
return [idHash hash];
}
Run Code Online (Sandbox Code Playgroud)
然后,在查询数据库之后,我将值放在一个数组中,然后放在一个应该删除重复项的集合中,如下所示:
NSMutableSet *noDuplicates = [[NSMutableSet alloc] initWithArray:tempResults];
Run Code Online (Sandbox Code Playgroud)
你可以看到我在做错了isEquals或hash执行?
非常感谢.
我有一个包含自定义对象的NSArray,例如:
[A, A, B, C, A, D, E, B, D]
分组这些项目的最佳方法是什么,最终结果类似于此?
A: 3
B: 2
C: 1
D: 2
E: 1
Run Code Online (Sandbox Code Playgroud)
请注意,重复项是具有相同属性的所有不同实例,但我已isEqual:为此重写.