Добавление конфликтующих методов в класс Objective C, используя категорию
Я добавил метод foo
в класс MYCustomClass
в категории Category1
отдельно от первоначального определения класса. Затем я добавил еще один метод, который также называется foo
в другой категории Category2
, Я тогда звоню foo
на примере MYCustomClass
, В моем случае foo
в Category2
называется Мой вопрос: есть ли объяснение этому? Или это одно из тех "неопределенных"/"зависимых от компилятора" поведений. Кроме того, возможно ли справиться с такими ситуациями, квалифицируя вызов метода, указав категорию, которую я хочу использовать в вызове.
РЕДАКТИРОВАТЬ: я знаю, что то, что я делаю, не поддерживается. Мне просто интересно, есть ли взломать вокруг этого.
2 ответа
Когда категория загружена, ее методы вставляются в существующую таблицу методов, и нет никакого способа отличить, откуда они пришли, как только это будет сделано. Последняя категория для загрузки выигрывает. В дни NeXTSTEP мы иногда делали это намеренно, как очень хитрый способ исправить испорченный метод в коде, для которого у нас не было исходного кода.
Это неопределенное поведение. Из документа языка программирования Objective-C:
Категория не может надежно переопределить методы, объявленные в другой категории того же класса.
Эта проблема имеет особое значение, потому что многие классы Какао реализованы с использованием категорий. Определенный каркасом метод, который вы пытаетесь переопределить, сам может быть реализован в категории, и поэтому реализация, которая имеет приоритет, не определена.
И нет, вы не можете указать, что вы хотите foo
от Category1
, или же foo
от Category2
, Если вам это нужно, вы должны дать разные имена этим методам, например, foo1
а также foo2
,