Как автоматические @ynthesized ivars влияют на * real * sizeof (MyClass)? - PullRequest
7 голосов
/ 02 ноября 2010

Если я включу некоторые автоматические свойства, подобные этому:

@property (nonatomic, readonly) NSInteger           test1;
@property (nonatomic, readonly) NSInteger           test2;
@property (nonatomic, readonly) NSInteger           test3;
@property (nonatomic, readonly) NSInteger           test4;

Но я НЕ объявляю для них iVars, я могу @synthesize их в файле .m следующим образом:

@synthesize test1;
@synthesize test2;
@synthesize test3;
@synthesize test4;

и это не проблема, компилятор автоматически добавляет iVars - sizeof (MyClass) показывает, что мой класс (как и следовало ожидать) на 16 байт больше, чем без объявленных и синтезированных этих свойств.Однако, если я не синтезирую их и реализую их так:

- (NSInteger)test1
{
    return 0;
}
- (NSInteger)test2
{
    return 0;
}
- (NSInteger)test3
{
    return 0;
}
- (NSInteger)test4
{
    return 0;
}

, тогда мой класс возвращается к своему первоначальному размеру.Это определяется по размеру WITHIN в файле .m для MyClass - поэтому на данном этапе компилятор знает, были ли переменные синтезированы или реализованы.

Однако другие классы не знают этого только из заголовочного файла sizeof(MyClass) показывает размер БЕЗ дополнительных (автоматических) iVars независимо от того, синтезированы они или нет.Это кажется мне совершенно запутанным, так как sizeof может возвращать другое значение.Как компилятор может вести себя корректно при создании подклассов и при использовании оператора разыменования + смещение (->) на открытых iVars подкласса, если он не может быть уверен в размере класса?

Ответы [ 2 ]

4 голосов
/ 02 ноября 2010

Прочитайте этот отличный пост не хрупкие ивары от всегда полезного хомяка. Также прочитайте этот пост с любовью.

Использование оператора sizeof довольно бесполезно для объекта Obj-C. Я считаю, что среда выполнения не использует его для манипулирования вещами.

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

Obj-C управляет указателями. Многое делается во время выполнения, а не во время компиляции, и на самом деле вы не можете использовать класс Obj-C в качестве значений, только как указатели. Например, вы можете получить любое значение с помощью valueForKey: и вызвать любой метод с executeSelector :. На самом деле, вы даже можете изменить реализацию методов во время выполнения с помощью методов из (например, class_replaceMethod).

Итог: Obj-C далек от того, что вы видели в C и C ++. Много вещей, если они выполняются во время выполнения, что дает некоторую гибкость, а также некоторую боль. Это просто другое. Вам следует прочитать документы Apple об Obj-C или, возможно, книгу о языке (например, «Программирование в Objective-C» Стивена Г. Кочана)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...