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;
}