Ich war mit einem einfachen OCUnit-Test für eine iPhone-App spielen, und wollte nur behaupten, dass die App Delegate eine Instanz der Klasse, die ich erwartet, dass es zu sein war. Ich hatte nicht erwartet, dass dieser Test sehr nützlich sein würde, aber es stellte sich heraus, dass ich ein Missverständnis bezüglich Objective C habe.
Ich erhalte zunächst einen Verweis auf den Delegierten. Dann protokolliere ich den Klassennamen dessen, was zurückkommt. In meinem Fall sagt die Ausgabe korrekt "app delegate's class name is CalculatorAppDelegate".
Die Behauptung in der nächsten Zeile schlägt jedoch fehl, und ich verstehe nicht, warum.
- (void)testAppDelegate
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}
Welche Umstände könnten dazu führen, dass NSStringFromClass() den richtigen Klassennamen zurückgibt, während isKindOfClass false zurückgibt?
2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds).