2013-03-11 19 views
7

W mojej aplikacji, w pewnym momencie, muszę zidentyfikować obiekty zmienne, aby odpowiednio je obsłużyć. Okazuje się, że jest to trudniejsze, niż się wydaje.Jak rozpoznać obiekty zmienne?

Jeśli używam isKindOfClass:[NSMutableString class] na NSString, wszystkie ciągi wydają się być zmienne.

Jeśli zapytam ich, czy odpowiadają na @selector(appendString:), wszystkie one.

Jeśli faktycznie spróbuję zmutować je w bloku @try ... @catch ... @finally, prawda zostanie ujawniona. Jest jednak bardzo nieelegancki i bardzo powolny.

Jaki byłby najlepszy sposób postępowania?

+2

Próbowałeś już użyć 'isMemberOfClass [[NSMutableString class]]'? – s1m0n

+0

Czy próbujesz określić, czy klasa jest rzeczywiście 'NSMutableString'? Jeśli tak, czy próbowałeś użyć metody 'isMemberOfClass:' zamiast, która zwraca 'TAK', jeśli faktycznie jest członkiem (ale nie podklasą) klasy? –

+0

I sprawdź zawsze interesujący blog BNR: [About Mutability] (http://blog.bignerdranch.com/803-about-mutability/) –

Odpowiedz

2

Jeśli chcesz zignorować zmienność, możesz iterować przez pętlę i tworzyć zmienne kopie każdego ciągu znaków za pomocą -mutableCopy (które, bez względu na to, tworzy NSMutableStrings). Jest odwrotnie: wysyłając -copy do każdego obiektu masz gwarancję niezmiennego NSString. Mutability nie jest niestety koncepcją czysto testowalną, ponieważ NSString jest klastrem klasy. Sprawdzanie klasy z tą linią @"__NSCFString" jest obrzydliwie niebezpieczne, ponieważ Apple ma prawo do zmiany klasy bazowej w dowolnym momencie.