Обработка переменных экземпляра из класса приводит к «Использование необъявленной переменной foo» - PullRequest
1 голос
/ 14 января 2012

Я хочу получить доступ к переменной экземпляра из класса, но, похоже, она не работает:

ClassA.h:

#import <Foundation/Foundation.h>

@interface ClassA: NSObject

@property int foo;

-(int) foo;
-(void) setFoo: (int) f;

@end

ClassA.m:

#import "ClassA.h"

@implementation ClassA
{
    int foo;
}

-(int) foo
{
    return foo;
}

-(void) setFoo: (int) f
{
    foo = f;
}

@end

CategoryA.h:

#import "ClassA.h"

@interface ClassA (CategoryA)

-(void) print;

@end

CategoryA.m:

#import "CategoryA.h"

@implementation ClassA (CategoryA)

-(void) print
{
    NSLog(@"Foo: %i", foo); //Use of undeclared variable 'foo'; did you mean 'for'?
}

@end

main.m

#import <Foundation/Foundation.h>
#import "ClassA.h"
#import "CategoryA.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool
    {
        ClassA *a = [[ClassA alloc] init];
        [a setFoo: 10];
        [a print];
    }
    return 0;
}

Я довольно новичок в Objective-C, поэтому я мог просто что-то пропустить.

Я знаю, что могу просто синтезировать foo, но это приводит к той же ошибке.

Проект можно скачать здесь: http://cl.ly/DL4s

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Категория не знает, что foo является переменной экземпляра, как вы определили ее в реализации ClassA.Вы объявили его как свойство, но все это означает, что будут методы с именем foo и setFoo:, а не переменная экземпляра с именем foo.

Вероятно, вам следуетзамените CategoryA на это:

@implementation ClassA (CategoryA)

-(void) print
{
    NSLog(@"Foo: %i", self.foo);
}

@end
0 голосов
/ 14 января 2012

Переместите объявление переменной в интерфейс, а не помещайте его в реализацию:

@interface ClassA: NSObject {
    int foo;
}

@property int foo;

-(int) foo;
-(void) setFoo: (int) f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...