Czy bezpieczne jest użycie isKindOfClass: przeciwko instancji NSString w celu określenia typu?

OdisKindOfClass: dokumentacja metody w NSObject:

Zachowaj ostrożność podczas używania tej metody na obiektach reprezentowanych przez klaster klas. Ze względu na naturę klastrów klasowych, obiekt, który otrzymujesz, nie zawsze jest typem oczekiwanym.

Następnie dokumentacja podaje przykład, dlaczego nigdy nie należy pytać o coś takiego jak przykład NSArray:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Teraz, aby podać przykład innego zastosowania, powiedzmy, że mam instancję NSObject, w której chciałbym ustalić, czy mam NSString lub NSArray.

Oba te typy są klastrami klas - ale z powyższej dokumentacji wynika, że ​​niebezpieczeństwo leży w odpowiedzi na isKindOfClass: bycie zbyt afirmatywnym (czasami odpowiadając TAK, gdy naprawdę nie masz zmiennej tablicy), podczas gdy pytanie o proste członkostwo w klaster nadal będzie ważny.

Przykład:

NSObject *originalValue;

// originalValue gets set to some instance

if ( [originalValue isKindOfClass:[NSString class]] )
   // Do something with string

Czy to założenie jest poprawne? Czy naprawdę jest bezpieczne używanie isKindOfClass: przeciwko instancjom klastrów klas w celu określenia członkostwa? Jestem szczególnie zainteresowany odpowiedzią na wszechobecne NSString, NSArray i NSDictionary, ale chciałbym wiedzieć, czy można go uogólnić.

questionAnswers(4)

yourAnswerToTheQuestion