目标C:Getter方法与Class.ivarName

时间:2012-05-02 16:43:10

标签: getter nslog inheritance ivar

我对如何跨文件访问变量感到很困惑。

例如:

我有3个文件:Apple,Fruit和Eat

Fruit.h

@interface Fruit
{
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

Fruit.m

@implementation Fruit
    #import "Fruit.h"
{
    @synthesize name;

    -(id) init
    {
        self = [super init];
        if (self) {
            name = [[NSMutableArray alloc] init];
        }
        return self;
    }
    }
@end

Apple.h

@interface Apple
#import Fruit.h
{
Fruit *apple;
}
@property (nonatomic, retain) Fruit *apple;
@end

Apple.m

#import Apple.h
@implementation Apple
@synthesize apple;

apple = [[Fruit alloc] init];
apple.name = @"apple";
@end

//我的Eat.h几乎是空的,因为我觉得我不需要它

Eat.m

@implementation Eat
#import Apple.h
//why is this not working?
NSLog(@"I am eating %@", apple.name);

我从头开始写这些例子。因此,请忽略愚蠢的语法错误,例如缺少分号,以及我错过的显而易见的事情。我只是在反映我正在努力的事情。

我想我的困惑是,在Apple.m中,您可以使用句点符号(。)访问Fruit的名称ivar。但在Eat.m中,我无法使用(。)访问苹果的名字ivar。我知道我应该/可以写一个getter方法,但是有没有办法直接访问变量,就像我试图跨文件一样?我知道它可能是糟糕的编程技术(如果它甚至可以完成),但我只是混淆了为什么功能不一样。

1 个答案:

答案 0 :(得分:0)

如果Apple是一种Fruit,那么它将继承'name'属性。您的示例实现并未将Apple显示为一种Fruit类型,但我认为您的意思是它(稍后会详细介绍)。

变量'apple'在Eat.m中使用,在Apple.m中分配,但不会导出到任何地方。 Eat.m的汇编应该失败,“变量'苹果'未知”。

'name'的Fruit字段被赋予NSMutableArray,但它实际上是一个字符串。编译器应该已经警告过这一点。并且,您没有Fruit'init'例程,为水果分配初始名称。

这是一个有效的版本:

/* Fruit.h */
@interface Fruit : NSObject { NSString *name; };
@property (retain) NSString *name;
 - (Fruit *) initWithName: (NSString *) name;
@end

/* Fruit.m */
/* exercise for the reader */

/* Apple.h */
# import "Fruit.h"
@interface Apple : Fruit {};
@end

/* Apple.m */
/* exercise for the reader - should be empty */

/* main.c - for example */
#import "Apple.h"
int main () {
 Apple apple = [[Apple alloc] initWithName: @"Bruised Gala"];
 printf ("Apple named: %@", apple.name);
}