Ошибка обращения к переменной экземпляра ‘variable’ в методе класса

#objective-c

#objective-c

Вопрос:

У меня есть переменная, объявленная в файле заголовка :

@интерфейс

 int _nPerfectSlides;
  

и

 @property (nonatomic, readwrite) int _nPerfectSlides;
  

и у меня есть метод, который я объявил в заголовке :

   (void) hit;
  

Метод содержит следующий код :

   (void) hit {
    NSLog(@"hit");
    _nPerfectSlides = 0;
    [_game showHit];
}
  

теперь по какой-то причине я получаю ошибку «Доступ к переменной экземпляра ‘_nPerfectSlides’ в методе класса», и кажется, что я не могу получить доступ к каким-либо переменным внутри метода. Что я делаю не так?

Ответ №1:

1. Для (void)hit : иметь доступ только к self объекту.

Шаг 1: Удалите следующую строку из файла заголовка

 @property (nonatomic, readwrite) int _nPerfectSlides;
  

Шаг 2:

  • Добавьте int _nPerfectSlides в свой файл класса глобально..
  • Это означает, что объявить перед @implementation

Например: в .m File

 #import "Controller.h"
int _nPerfectSlides // Add like this before @implementation

@implementation Controller
  

2. Для - (void)hit : иметь доступ только к методам экземпляра

Ответ №2:

Если вы хотели сделать это методом экземпляра, измените это на -.

Комментарии:

1. Да, я пробовал это перед публикацией, это устранило эту проблему, но когда я пытаюсь вызвать метод из другого класса, он выходит из строя… что мне делать?

2. Создайте экземпляр класса и вызовите метод экземпляра для этого экземпляра…

3. Вы, кажется, не поняли основные концепции ООП. Вы усвоили документы, подобные этому? otierney.net/objective-c.html

4. @Cyrille вы правы, я новичок в ООП tbh, привык к структурированному кодированию. Я читаю несколько документов по сети и пытаюсь разобраться в этом, а также сформировать свой ООП. но в любом случае спасибо

Ответ №3:

Переменная экземпляра, как следует из ее названия, доступна только в методах экземпляра (объявленных с помощью - ). Методы класса (объявленные с помощью ) не имеют доступа к переменной экземпляра, не более, чем они имеют доступ к self объекту.

Комментарии:

1. хорошо, итак, как я могу создать метод класса для доступа к нему из других классов, пока у меня есть доступ к переменным экземпляра?

2. Я не понимаю вашего комментария. Либо вы изменяете свой (void) hit на - (void) hit , либо вы объявляете _nPerfectSlides на глобальном уровне, за пределами вашего класса’ @interface .

Ответ №4:

Я знаю, что это устарело, но оно все еще появляется. Попробуйте сделать ее статической. Здесь я немного изменяю код, чтобы увеличить его.

 // Hit.h

#import <Foundation/Foundation.h>
@interface Hit : NSObject
  (void)hit;
@end

// Hit.m

#import "Hit.h"
@implementation Hit
static int val = 0;
  (void)hit {
    val  = 1;
    [self showHit];
}
  (void)showHit {
    NSLog(@"hit value: %d", val);
}
@end

//main.m

#import <Foundation/Foundation.h>
#import "Hit.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [Hit hit];
        [Hit hit];
        [Hit hit];
    }
    return 0;
}