Przetestowałem niektóre isa swizzling za pomocą Swift i stwierdziłem, że działa tylko wtedy, gdy NSObject jest super-klasą (bezpośrednio lub wyżej) lub używając dekoracji „@objc”. W przeciwnym razie będzie postępować zgodnie ze stylem static- i vtable-dispatch, jak C ++.
Czy definiowanie klasy Swift bez klasy bazowej Cocoa / NSObject jest normalne? Jeśli mnie to niepokoi, oznacza to rezygnację z dużej części dynamiki Objective-C, takiej jak przechwytywanie metod i introspekcja w czasie wykonywania.
Dynamiczne zachowanie w czasie wykonywania leży u podstaw takich funkcji, jak obserwatorzy właściwości, dane podstawowe, programowanie zorientowane na aspekty , przesyłanie wiadomości wyższego rzędu , struktury analityczne i rejestrowania itd.
Użycie stylu wywołania metody Objective-C dodaje około 20 operandów kodu maszynowego do wywołania metody, więc w pewnych sytuacjach ( wiele ciasnych wywołań metod z małymi treściami) wysyłanie statyczne i vtable w stylu C ++ może działać lepiej.
Ale biorąc pod uwagę ogólną zasadę 95-5 ( 95% wzrostu wydajności pochodzi z dostrojenia 5% kodu ), czy nie ma sensu zaczynać od potężnych funkcji dynamicznych i wzmacniać je tam, gdzie to konieczne?