从类中访问实例变量会导致“使用未声明的变量foo”

时间:2012-01-14 16:44:10

标签: objective-c

我想从类中访问实例变量,但它似乎不起作用:

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 个答案:

答案 0 :(得分:2)

该类别不知道foo是一个实例变量,因为您已在ClassA的实现中对其进行了定义。您已将其声明为属性,但所有这些意味着将存在名为foosetFoo:的方法,而不是还有一个名为foo的实例变量。

您应该将CategoryA更改为:

@implementation ClassA (CategoryA)

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

@end

答案 1 :(得分:0)

将变量声明移动到界面中,而不是将其放在实现中:

@interface ClassA: NSObject {
    int foo;
}

@property int foo;

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