Добавление конфликтующих методов в класс Objective C, используя категорию

Я добавил метод foo в класс MYCustomClass в категории Category1 отдельно от первоначального определения класса. Затем я добавил еще один метод, который также называется foo в другой категории Category2, Я тогда звоню foo на примере MYCustomClass, В моем случае foo в Category2 называется Мой вопрос: есть ли объяснение этому? Или это одно из тех "неопределенных"/"зависимых от компилятора" поведений. Кроме того, возможно ли справиться с такими ситуациями, квалифицируя вызов метода, указав категорию, которую я хочу использовать в вызове.

РЕДАКТИРОВАТЬ: я знаю, что то, что я делаю, не поддерживается. Мне просто интересно, есть ли взломать вокруг этого.

2 ответа

Решение

Когда категория загружена, ее методы вставляются в существующую таблицу методов, и нет никакого способа отличить, откуда они пришли, как только это будет сделано. Последняя категория для загрузки выигрывает. В дни NeXTSTEP мы иногда делали это намеренно, как очень хитрый способ исправить испорченный метод в коде, для которого у нас не было исходного кода.

Это неопределенное поведение. Из документа языка программирования Objective-C:

Категория не может надежно переопределить методы, объявленные в другой категории того же класса.

Эта проблема имеет особое значение, потому что многие классы Какао реализованы с использованием категорий. Определенный каркасом метод, который вы пытаетесь переопределить, сам может быть реализован в категории, и поэтому реализация, которая имеет приоритет, не определена.

И нет, вы не можете указать, что вы хотите foo от Category1, или же foo от Category2, Если вам это нужно, вы должны дать разные имена этим методам, например, foo1 а также foo2,

Другие вопросы по тегам