2009-12-04 4 views
4
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3]; 

if ([arr isMemberOfClass:[NSMutableArray class]]) { 
    NSLog(@"YEP!!"); 
} else { 
    NSLog(@"NO!!"); 
} 

Я получаю всегда «НЕТ!» в консоли. Я попытался использовать Array, NSNumber, NSString. Все они, похоже, не работают. Это странно. Поскольку я получаю это из документов, этот метод должен возвращать YES, если я снова тестирую класс объекта, который подвергается тестированию. Я использую Foundation.h, а не Core Foundation (если это имеет какое-либо значение).Почему -isMemberOfClass: не работает здесь?

+0

Как правило, -isMemberOfClass: никогда не нужен метод. Есть только несколько очень специализированных ситуаций, где это действительно полезно. Всегда используйте -isKindOfClass: вместо этого. –

ответ

9

Вам необходимо использовать isKindOfClass: или respondsToSelector: как NSArray и аналогичные - class clusters - вы фактически получаете подклассы при их создании. См. this answer для некоторых интересных бит на этом.

+0

@gf, что такое кластер классов? –

+0

См. Документацию на яблоко: http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34 –

3

Когда вы создаете массив с использованием [NSMutableArray arrayWithCapacity:], объект, который вы получаете, фактически является членом какого-либо конкретного подкласса NSMutableArray. NSMutableArray существует только мгновенно в процессе создания конкретного экземпляра.

-isMemberOfClass: возвращает true, если указатель приемника isa равен данному классу. -isKindOfClass: возвращает true, если приемник является членом данного класса или любого из его подклассов.