Вы можете представить, что объект target-c - это просто структура C, которая выглядит следующим образом:
typedef struct {
Class isa;
} NSObject;
Экземпляр этой структуры будет занимать 4 байта в 32-битной системе.Поскольку он состоит из одного указателя - класс похож на id.
Подкласс NSObject, MySubclass с одной переменной экземпляра 'char' будет выглядеть так:
typedef struct {
Class isa;
char singleInstanceVariable.
} MySubclass;
Подкласс простоимеет все переменные экземпляра своего суперкласса в начале, плюс свои собственные в конце.Вы можете увидеть это в отладчике, набрав в консоли 'p * object'.
Размер MySubclass в 32-битной системе будет 5 байтов.Один указатель, плюс один символ.Таким образом, размер объекта - это размер всех его переменных экземпляра, добавленных вместе.Важно знать, что размер объекта связан только с его переменными экземпляра.На это не влияет количество методов, которые у него есть.Эти методы не требуют дополнительной памяти, так как создается больше экземпляров.Методы имеют фиксированную начальную стоимость.
Еще одна вещь, которую следует учитывать, - это то, что объекты обычно имеют указатели на другие объекты в качестве переменных экземпляра.Например, предположим, что каждый UIView имеет NSMutableArray для ссылки на его подпредставления.Этот массив может быть 12 байтов, когда пуст.Таким образом, пустой UIView будет размером всех переменных в UIView, который будет включать 4 байта для указателя на массив, плюс вы также можете учитывать 12 дополнительных байтов, используемых фактическим экземпляром массива.Это все просто, хотя, массив и представление - это два разных объекта, но представление не может быть использовано без массива.
Наконец, большинство выделений округлены до некоторого количества, чтобы сделать mallocреализация быстрее и удовлетворяет некоторым ограничениям архитектуры машины, чтобы указатели были правильно выровнены.Кроме того, переменные экземпляра объекта могут иметь пустое заполнение между ними подобно заполнению структуры