2009-02-17 10 views
5

w Objective-C, można zmienić dynamiczną danego typu obiektu w czasie wykonywania przez przypisanie to isa członek zmienna:Czy zdefiniowano zachowanie, aby zmienić isa obiektu Objective-C?

id object = ...; 
object->isa = [SomeClass class]; 

Czy to niezdefiniowane zachowanie? Obecnie robię to jako kludge na coś innego i wygląda na to, że działa, ale czuję się tak brudny, robiąc to w ten sposób. Nowa klasa, którą ustawiam, nie dodaje żadnych zmiennych członkowskich, po prostu przesłania jedną metodę i dodaje nową, więc rozmiar klasy jest taki sam. Mam wrażenie, że gdybym zmienił rozmiar obiektu, spowodowałoby to wiele zła.

+0

możliwy duplikat [Objective-C: Jak zmienić klasę obiektu w czasie wykonywania?] (Http://stackoverflow.com/questions/8512793/objective-c-how-to-change-the-class- of-an-object-at-runtime) –

+0

Możesz napotkać problemy z KVO. Używają też isa-swizzling. Mike Ash ma jednak kompletne rozwiązanie: http://www.mikeash.com/pyblog/friday-qa-2010-11-19-creating-classes-at-runtime-for-fun-and-profit.html – nielsbot

Odpowiedz

1

Myślę, że to, jak mówisz, brudne.

podejrzewam, to będzie działać, jeżeli:

  • Nowo przypisana klasa jest podklasą klasy rzeczywistym.
  • Nowa klasa nie dodaje żadnych zmiennych członkowskich.

Przyznaję jednak, że nie znam implementacji systemu wykonawczego Objective-C. Po prostu wiem, co ma sens w przypadku wdrożenia.

0

Zmiana tych ustawień jest naprawdę złym pomysłem i zawiera wiele założeń dotyczących zachowania środowiska wykonawczego - znacznie lepiej jest korzystać z runtime functions, mimo że nie zapewniają one mechanizmu umożliwiającego bezpośrednią zmianę klasy.

+0

Wiem tak działa KVO – nielsbot

0

This answer Joshua Weinberg zapewnia właściwą drogę, aby to zrobić. To zadziałało dla mnie. :)

I Darron miał rację ze swoim zgaduje :) to będzie działać tylko wtedy, gdy jest to nadklasą bieżącego obiektu, a jeśli nie dodawać żadnych członków.

1

Środowisko wykonawcze Objective-C udostępnia teraz funkcję: object_setClass. Dokumentacja nie mówi, jakie są ograniczenia, ale (jak stwierdzili inni) wyobrażam sobie, że chciałbyś ograniczyć nową klasę do klasy z dokładnie takim układem zmiennych, jak oryginalna klasa.

Powiązane problemy