Почему категории не могут иметь переменные экземпляра?
-
21-12-2019 - |
Вопрос
Я понимаю, что мы можем использовать ассоциативные ссылки, чтобы вызвать подобное иварное поведение в категориях.Но в чем конкретная причина не может объявить новые иверы в категориях?
Это потому, что мы бы вторгаемся в частное пространство класса?Или есть ли другая причина?Если да, я был бы признателен за примера, который показывает возможность объявить ивар в категориях, нарушающих все, что он ломается.
Решение
думать о иварных объектах, таких как простая старая C-структура. Когда вы создаете экземпляр класса, блок памяти создан достаточно большим, чтобы удерживать эту структуру.
Допустим, у вас есть генеракодицетагкод. Многие и много существующего кода составляются для использования NSString
. Многие из этого кода встроены в библиотеки и рамки. Этот скомпилированный код был создан, зная, что ивар генеракодицетагкодов принимают x количество байтов и находятся в некоторых заданных смещениях в этой памяти.
Теперь в вашем собственном маленьком проекте позволяет вам создать категорию на NSString
и хотите добавить ивар. Теоретически любой код в вашем проекте, который включает в себя файл заголовка для категории, будет знать, что размер этого «нового» NSString
(категория плюс) принимает X + Y Bytes. Это очень похоже на подкласс. Этот недавно скомпилированный код может правильно иметь дело с дополнительными инарами.
Но весь предварительно скомпилированный код, библиотеки и рамки, не имеют знания о дополнительных ивар. Когда экземпляры NSString
создаются там, память только X байтов, а не X + Y Bytes. Chaos ждет, когда ваш код приложения получает ссылку на то, что меньший кусок памяти и пытается получить доступ к байтам для категории IVAR. Вещи пойдут бум.
с простым старым подклассом, вещами работают потому, что любой код, который может использовать IVARS подкласса, знает о Иварах подкласса. Но с категорией ранее существующий код не имеет знания о дополнениях и не будет должным образом создавать для них пространство.
Я полагаю, я должен указать, что все вышеперечисленное в основном является образованным догадыванием. Я мог бы быть совершенно неправильным. Это кажется разумным, по крайней мере. :)