Синтезированные переменные экземпляра генерируются как частные вместо защищенных? - PullRequest
4 голосов
/ 12 февраля 2012

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

Например, если я напишу:

@interface MyFirstClass
@property (readonly, nonatomic) int size; 
@end

и в .м

@implementation MyFirstClass
@synthesize size;
@end

Затем для меня будет добавлена ​​переменная экземпляра с именем "size" и будет реализован метод с именем "- (int) size".

Проблема в том, что когда я создаю второй класс MySecondClass, который является подклассом MyFirstClass, кажется, что я не могу получить доступ к размеру переменной экземпляра в этом подклассе:

@interface MySecondClass : MyFirstClass
@end

@implementation MySecondClass
- (id)init {
    if (self = [super init]) {
        size = 10;  // this yields and error
    }
    return self;
}
@end

Являются ли автоматически созданные переменные экземпляра закрытыми? Есть ли возможность установить их как защищенные, чтобы я мог получить к ним доступ в подклассах? Я знаю, что есть возможность объявить переменную экземпляра самостоятельно, но мне просто интересно ...

С таким суперклассом он работает: (Это потому, что он явно объявлен защищенным?)

@interface MyFirstClass {
    int size;  // defined expressly and used as @protected
}
@property (readonly, nonatomic) int size;
@end

Спасибо за вашу помощь !! Nicolas.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

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

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

0 голосов
/ 12 февраля 2012

Использование:

self.size = 10;

Это сопоставит метод setSize.

...