目标c是KindOfClass的误解吗?

Vit*_*tek 17 objective-c instanceof

我有以下对象结构:

动物,狗和猫.正如你所料,狗和猫是从动物遗传的.

我有一个农场班:

 @implementation AnimalFarm

-(Animal*) createAnimal:(AnimalType)type{

  switch (type) {

    case CAT:
      return [Cat new];

    case DOG:
      return [Dog new];

    default:
      return [Animal new];
  }

}

@end
Run Code Online (Sandbox Code Playgroud)

我试着进行单元测试:

  AnimalFarm *farm = [AnimalFarm new];

  Animal *dog = [farm createAnimal:DOG];
  Animal *cat = [farm createAnimal:CAT];

  STAssertTrue([cat isMemberOfClass:[Cat class]],@"cat is not a cat!");
  STAssertTrue([dog isMemberOfClass:[Dog class]],@"Dog is not a dog!");

  STAssertTrue([cat isKindOfClass:[Animal class]],@"Cat is not an animal!");
  STAssertTrue([dog isKindOfClass:[Animal class]],@"Cat is not an animal!");
Run Code Online (Sandbox Code Playgroud)

课程实施:

@interface Cat : Animal {

}


@end

@implementation Cat

  -(NSString*) say{
    return @"miau";
}

@end
Run Code Online (Sandbox Code Playgroud)

狗的实施是类似的.

但是,无论是KindOfClass还是isMemberOfClass都没有像我预期的那样工作....

我错过了什么吗?


当我使用IF而不是切换时,一切顺利......但有什么区别?

有效的createAnimal的实现:

-(Animal *) createAnimal:(AnimalType)type {

  if (type == DOG) {
    return [Dog new]; 
  } else if (type == CAT) {
    return [Cat new]; 
  } else {
    return [Animal new];
  }
Run Code Online (Sandbox Code Playgroud)

dre*_*lax 45

isMemberOfClass:只有YES在实例的类完全相同时isKindOfClass:才会返回,但是YES如果实例的类相同,则返回,或者返回给定类的子类.

例如,这将输出No!:

BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
Run Code Online (Sandbox Code Playgroud)

但这将输出Yes!:

BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
Run Code Online (Sandbox Code Playgroud)

这是因为NSMutableArray是一种 NSArray,但它不是NSArray类的成员(否则它不会是NSMutableArray).

在整个Foundation和Cocoa中,有许多"类集群".您可以在Apple开发人员网站上的文档中阅读更多相关信息.由于类集群的性质,如果您创建可能是NSString对象,则可能无法通过isMemberOfClass:[NSString class]测试.

如果两者都没有isKindOfClass:isMemberOfClass:正在返回正确的值,请查看实际对象所在的类

NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);
Run Code Online (Sandbox Code Playgroud)

如果这些返回的东西不是他们应该的东西,那么你的农场类就会出现问题.