Если я включу некоторые автоматические свойства, подобные этому:
@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 подкласса, если он не может быть уверен в размере класса?