Objective c 与清晰、模糊的物体混淆
我认为Objective c 与清晰、模糊的物体混淆,objective-c,nsnumber,nscountedset,Objective C,Nsnumber,Nscountedset,我认为NSCountedSet在频率上计数了numB和numC两次,因为它们具有相同的值,所以我从我的类Fraction创建了两个Fraction对象(未显示),并设置了它们的ivar(分子,分母)彼此相等,但countForObject:将它们视为两个不同的对象,并将它们的频率计算为一个numA和numB指向内存中的不同位置,但共享相同的值,两个Fraction对象指向内存中的不同位置,但共享相同的值。为什么数字对象被视为模糊对象,而不是分数对象 #import <Foundation/
NSCountedSet
在频率上计数了numB
和numC
两次,因为它们具有相同的值,所以我从我的类Fraction
创建了两个Fraction
对象(未显示),并设置了它们的ivar
(分子
,分母
)彼此相等,但countForObject:
将它们视为两个不同的对象,并将它们的频率计算为一个numA
和numB
指向内存中的不同位置,但共享相同的值,两个Fraction
对象指向内存中的不同位置,但共享相同的值。为什么数字
对象被视为模糊对象,而不是分数
对象
#import <Foundation/Foundation.h>
#import "Fraction.h"
int main (int argc, char *argv[]) {
@autoreleasepool {
NSNumber *numA = [NSNumber numberWithInt: 1];
NSNumber *numB = [NSNumber numberWithInt: 2];
NSNumber *numC = [NSNumber numberWithInt: 2];
NSArray *array = [NSArray arrayWithObjects: numA, numB, numC, nil];
NSCountedSet *mySet = [[NSCountedSet alloc] initWithArray: array];
for (NSNumber *myNum in mySet) {
NSLog(@"Number: %i Frequency: %lu", [myNum intValue], [mySet countForObject: myNum]);
}
}
return 0;
}
<> >为了使您的自定义类被“代码> NSCONTEDSETT/CODE >和基础的其余部分所识别,必须正确执行<代码> -IsAs:<代码>和<代码> -hash < /C> >。默认情况下,它们比较指针,因此即使两个对象表示相同的数据,它们也不会进行相等的比较。对于
分数
类,-isEqual:
的天真实现可能如下所示:
- (BOOL)isEqual: (id)anObject {
#error Naive implementation. Do not use.
if (anObject == self) {
return YES;
} else if ([anObject isKindOfClass: [Fraction class]]) {
Fraction *reducedSelf = [self reducedFraction];
Fraction *reducedOther = [anObject reducedFraction];
if (reducedSelf.numerator == reducedOther.numerator && reducedSelf.denominator == reducedOther.denominator) {
return YES;
}
}
return NO;
}
- (NSUInteger)hash {
#error Naive implementation. Do not use.
Fraction *reducedSelf = [self reducedFraction];
return reducedSelf.numerator ^ reducedSelf.denominator;
}
请注意,这将不允许您将Fraction
类的实例与NSNumber
的实例进行比较。因为-isEqual:
必须是可交换的,并且因为相等的对象必须具有相同的哈希值,所以您需要提供一个与NSNumber
兼容的实现(可能通过将其子类化并使用NSNumber
的实现)
- (BOOL)isEqual: (id)anObject {
#error Naive implementation. Do not use.
if (anObject == self) {
return YES;
} else if ([anObject isKindOfClass: [Fraction class]]) {
Fraction *reducedSelf = [self reducedFraction];
Fraction *reducedOther = [anObject reducedFraction];
if (reducedSelf.numerator == reducedOther.numerator && reducedSelf.denominator == reducedOther.denominator) {
return YES;
}
}
return NO;
}
- (NSUInteger)hash {
#error Naive implementation. Do not use.
Fraction *reducedSelf = [self reducedFraction];
return reducedSelf.numerator ^ reducedSelf.denominator;
}