Все ли объекты занимают одинаковое количество памяти? Objective-C - PullRequest
0 голосов
/ 26 ноября 2010

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

Ответы [ 5 ]

2 голосов
/ 26 ноября 2010

Вы можете представить, что объект 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реализация быстрее и удовлетворяет некоторым ограничениям архитектуры машины, чтобы указатели были правильно выровнены.Кроме того, переменные экземпляра объекта могут иметь пустое заполнение между ними подобно заполнению структуры

2 голосов
/ 26 ноября 2010

Попробуйте class_getInstanceSize([MyClass class]);. Грубо говоря, использование памяти экземпляром будет округлено до шестнадцати байтов. Конечно, это не включает накладные расходы любых связанных объектов (см. objc_setAssociatedObject) или выделения, которые делает класс.

2 голосов
/ 26 ноября 2010

Это зависит от количества и характера переменных экземпляра суперкласса.NSObject имеет один ивар, указатель isa.UIViewController имеет около 30 иваров, большинство из них - указатели (вы можете посмотреть список в UIViewController.h).

Так что любой подкласс UIViewController займет столько памяти, сколько необходимо для хранения всехэти ивары и все ивары его суперклассов (UIResponder (без иваров) и NSObject (один ивар)).

В этом вычислении не учитывается фактическая память, используемая объектами данного экземплярассылка на переменные при инициализации, конечно.Например, полностью инициализированный контроллер представления может удерживать объект представления, который занимает значительный объем памяти.

0 голосов
/ 26 ноября 2010

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

Вы всегда можете приложить ваше приложение к инструменту производительности Распределение инструментов, чтобы сравнить разницу.

0 голосов
/ 26 ноября 2010

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

Объект выделит память для каждого из его иваров и его методов,Объем необходимой памяти зависит от типов C ... все они различаются в зависимости от типа данных, которые хранятся.

...