Почему категории не могут иметь переменные экземпляра?

StackOverflow https://stackoverflow.com//questions/21035660

Вопрос

Я понимаю, что мы можем использовать ассоциативные ссылки, чтобы вызвать подобное иварное поведение в категориях.Но в чем конкретная причина не может объявить новые иверы в категориях?

Это потому, что мы бы вторгаемся в частное пространство класса?Или есть ли другая причина?Если да, я был бы признателен за примера, который показывает возможность объявить ивар в категориях, нарушающих все, что он ломается.

Это было полезно?

Решение

думать о иварных объектах, таких как простая старая C-структура. Когда вы создаете экземпляр класса, блок памяти создан достаточно большим, чтобы удерживать эту структуру.

Допустим, у вас есть генеракодицетагкод. Многие и много существующего кода составляются для использования NSString. Многие из этого кода встроены в библиотеки и рамки. Этот скомпилированный код был создан, зная, что ивар генеракодицетагкодов принимают x количество байтов и находятся в некоторых заданных смещениях в этой памяти.

Теперь в вашем собственном маленьком проекте позволяет вам создать категорию на NSString и хотите добавить ивар. Теоретически любой код в вашем проекте, который включает в себя файл заголовка для категории, будет знать, что размер этого «нового» NSString (категория плюс) принимает X + Y Bytes. Это очень похоже на подкласс. Этот недавно скомпилированный код может правильно иметь дело с дополнительными инарами.

Но весь предварительно скомпилированный код, библиотеки и рамки, не имеют знания о дополнительных ивар. Когда экземпляры NSString создаются там, память только X байтов, а не X + Y Bytes. Chaos ждет, когда ваш код приложения получает ссылку на то, что меньший кусок памяти и пытается получить доступ к байтам для категории IVAR. Вещи пойдут бум.

с простым старым подклассом, вещами работают потому, что любой код, который может использовать IVARS подкласса, знает о Иварах подкласса. Но с категорией ранее существующий код не имеет знания о дополнениях и не будет должным образом создавать для них пространство.

Я полагаю, я должен указать, что все вышеперечисленное в основном является образованным догадыванием. Я мог бы быть совершенно неправильным. Это кажется разумным, по крайней мере. :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top