почему размер объекта, унаследованного от NSObject, составляет 16 байт - PullRequest
1 голос
/ 10 ноября 2011

У меня есть новый объект, унаследованный от NSObject

Car *myCar = [[Car alloc] init];

Это возвращает 16, размер Car объекта

printf("myCar object: %d\n", sizeof(*myCar));

PLZ, помогите мне прояснить этоспасибо

Ответы [ 3 ]

4 голосов
/ 10 ноября 2011

Вы не можете использовать sizeof() для определения размера объекта Objective-C. Вместо этого вы можете использовать class_getInstanceSize().

Однако , размер экземпляра класса совершенно бесполезен по многим, многим причинам.

Что вы пытаетесь сделать?

3 голосов
/ 10 ноября 2011

sizeof в этом случае работает как C.

Как сказал bbum, вы не должны использовать sizeof на NSObject типах (но указатели на NSObject s в порядке).Clang запрещает запрашивать sizeof и объект.Среда выполнения objc должна быть вашей справкой, если вам нужен размер объекта, поскольку фактический размер объекта objc не является статическим значением (во время компиляции), он определяется во время выполнения.

С учетом следующих типов:

@interface A : NSObject
@end

@interface B : A
{
    uint64_t ivar;
}
@end

И эти сообщения:

printf("Class size is %lu\n", sizeof(Class)); // << for NSObject.isa
printf("NSObject size is %lu\n", sizeof(NSObject));
printf("A size is %lu\n", sizeof(A));
printf("B size is %lu\n", sizeof(B));

На 64-битных мы получаем:

Class size is 8
NSObject size is 8
A size is 8
B size is 16

А на 32-битных мы получаем:

Class size is 4
NSObject size is 4
A size is 4
B size is 12

Есть небольшой пример, который показывает вам, почему размеры растут.Для более подробной информации, здесь - страница википедии.

2 голосов
/ 10 ноября 2011

Это количество байтов, которое было выделено для объекта хранения класса NSObject.

Почему вам это не нравится?

...