我对如何跨文件访问变量感到很困惑。
例如:
我有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方法,但是有没有办法直接访问变量,就像我试图跨文件一样?我知道它可能是糟糕的编程技术(如果它甚至可以完成),但我只是混淆了为什么功能不一样。
答案 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);
}