0

継承を使用せずに#importがどのように機能するかを理解するのを手伝ってください。

そこで、Personという名前のクラスとBodyという名前の別のクラスを作成しました(どちらのクラスもNSObjectから継承されています)。

Bodyクラスには3つのivarがあります(プロパティで設定)

  int hands;
  int feet;
  int legs;

次に、Bodyクラス(* body)のインスタンスをPersonクラスにインポートして作成しました。私の理解では、Bodyクラスから「タイプ」を作成しました。次に、このivarにプロパティが設定されました。

次に、主に、personという名前のPersonクラスからインスタンスを作成しました。Mainはperson.body.feetを認識しますが、その値を直接取得および設定することはできません。それを実行できる唯一の方法は、その値を新しいint変数に渡してから、新しい変数を出力することです。

明らかに私は苦労している初心者ですが、私は本当にこの問題を理解したいです-

  #import <Foundation/Foundation.h>
    #import "Person.h"

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

        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        Person *person = [[Person alloc]init];

        // this works and NSLog prints out the value is 2
        int feet = person.body.feet = 2;
        NSLog(@"person.body = %i",feet);


        // this does not work - NSLog prints out the value is 0; 
        [person.body setFeet:2];
        NSLog(@"person.body = %i", person.body.feet );



        [person release];
        [pool drain];
        return 0;
    }

    #import <Foundation/Foundation.h>
#import "Body.h"

@interface Person : NSObject {

    Body *body;

}

   @property (assign) Body *body;

@end


#import "Person.h"

@implementation Person

  @synthesize  body;

@end


#import <Foundation/Foundation.h>

@interface Body : NSObject {

    int hands;
    int feet;
    int legs;

}

@property int hands;
@property int feet;
@property int legs;

@end



#import "Body.h"

@implementation Body

@synthesize hands;
@synthesize feet;
@synthesize legs;


@end
4

1 に答える 1

2

私の推測では、あなたはどこにもBodyオブジェクトを割り当てていません。person.body

Objective-Cのすべてのオブジェクトはヒープに割り当てられます。これらのアスタリスクはすべて、変数がポインタであることを示しています。ポインタは、オブジェクトが存在するメモリ位置を指す単なる数値です。オブジェクトを保持するプロパティを宣言するとき、実際に行っているのは、オブジェクトへのポインタを格納する場所を作成することだけです。オブジェクト自体を作成しているのではありません。

したがって、どこか(おそらくの指定されたイニシャライザー)で、実際にオブジェクトを作成し、それをプロパティに割り当てPersonたいと思うでしょう。Bodybody

これを行わないと、メモリの場所はにとどまります。0これは、と同等nilです。ここで割り当てを連鎖させる場合:

int feet = person.body.feet = 2;

...との2両方feetに割り当てていますperson.body.feetが、person.bodynilであるため、セッターメッセージは無視されます。後でログに記録しようとするとperson.body.feet、再びログに記録され、 /がnil返されます。nil0

編集:あなたのアップデートを見たので、はい、これはあなたの問題です。

Bodyこの行はオブジェクトを作成しません:

Body *body;

オブジェクトへのポインタのインスタンス変数を作成しBodyます。

Bodyこの行はオブジェクトを作成しません:

@property (assign) Body *body;

プロパティを宣言します。これは、getterおよびsetterメソッド宣言の構文糖衣です。

Bodyこの行はオブジェクトを作成しません:

@synthesize  body;

getterメソッドとsetterメソッドを作成することにより、以前に宣言されたプロパティを合成します。

実際にオブジェクトを作成して初期化し、BodyそれをPersonオブジェクトのbodyプロパティに割り当てる必要があります。例えば:

- (id)init {
    if (self = [super init]) {
        self.body = [[Body alloc] init];
    }
    return self;
}

retainまた、ARCを使用していないため、ほぼ確実にそのプロパティを宣言して、のメソッドassignで解放する必要があります。Persondealloc

于 2012-04-23T20:24:41.580 に答える