0

ファイル間で変数にアクセスする方法について、私はかなり混乱しています。

例えば:

Apple、Fruit、Eatの3つのファイルがあります

フルーツ.h

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

フルーツ.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 では、apple の名前 ivar に (.) でアクセスできません。getter メソッドを作成する必要がある/作成できることはわかっていますが、複数のファイルにまたがる方法で変数に直接アクセスする方法はありますか? おそらく悪いプログラミング手法であることは知っていますが(それが可能であれば)、なぜ機能が同じでないのか混乱しています。

4

1 に答える 1

0

Apple が Fruit のタイプである場合、'name' プロパティを継承します。あなたの実装例は Apple をフルーツの一種として示していませんが、あなたがそうするつもりだったと思います(そしてそれについては後で詳しく説明します)。

変数「apple」は Eat.m で使用され、Apple.m で割り当てられますが、どこにもエクスポートされません。Eat.m のコンパイルは、「変数 'apple' が不明です」で失敗するはずでした。

「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);
}
于 2012-05-03T14:52:53.637 に答える