Как инициализировать закрытую переменную-член - PullRequest
0 голосов
/ 10 ноября 2019

В приведенном ниже коде я хочу объявить частную переменную экземпляра и инициализировать ее нулем, но когда я пытаюсь инициализировать ее нулем, я получаю несущественную ошибку «;запятая ожидается в конце оператора ”

В качестве попытки решить проблему, я попытался выяснить, к какому значению инициализируется эта переменная:

-(void) startRecursion: (UIView *) uiviews {
    if (!uiviews) {
    return;
    }
    NSLog(@"numOfMethodCalls: %d", ++self->numOfMethodCalls);
    NSUInteger *countOfSubViews = [uiviews.subviews count];
}

Однако в журнале напечатано:

2019-11-10 14:08:25.711847+0100 UIEnhancement_00[10065:383388] numOfMethodCalls: 8

Пожалуйста, дайте мне знать, как решить эту проблему

код :

@interface UIEnhancements : NSObject {
 NSUInteger *numOfMethodCalls;
}

+(id) initSelf;

1 Ответ

1 голос
/ 10 ноября 2019

Экземпляр переменные автоматически обнуляются в Objective-C.

Ваш код печатает 8, поскольку вы объявили переменную как NSUInteger * - указатель (*) к NSUInteger. Теперь на 64-битной платформе NSUInteger имеет длину 8 байт.

(Objective-) C определяет оператор ++ для указателя , увеличивая его на размер любоговведите это указывает на. Таким образом, numOfMethodCalls был инициализирован на 0 автоматически, а затем ++ добавил к нему 8.

Переменные экземпляра лучше всего закрывать, как вы заявляете, но вы объявили об этом публично в@interface. Лучший способ - объявить это в реализации:

@implementation UIEnhancements
{
   NSUInteger numOfMethodCalls;
}

...

@end

Наконец, хотя вы не показываете реализацию, вы объявляете:

+(id) initSelf;

в вашем интерфейсе. Только методы, которые являются методами инициализации, должны начинаться с init, они являются экземплярами методами, и в современном Objective-C обычно объявляются как возвращающие instancetype (а не id), что улучшает время компиляциипроверки типа. В итоге:

- (instancetype) initSelf;

хотя, если это ваш единственный метод инициализации, вы должны назвать его просто init.

HTH

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