Подтвердить что ты не робот

Переменная "переменная" экземпляра, доступная в ошибке метода класса

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

@interface

int _nPerfectSlides;

и

@property (nonatomic, readwrite) int _nPerfectSlides;

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

+ (void) hit;

В этом методе есть следующий код:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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: иметь доступ только к методам экземпляров

Ответ 3

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

Ответ 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;
}