0

したがって、Foo.hで定義され、Foo.mで実装されたクラスがあります。次に、Fooをビューに接続するための複数のメソッドを持つFooController.h/mというコントローラーがあります。

Fooには複数のプロパティがあるので、次のように定義された3つだけを参照します。

// Foo.h

    @property (strong, nonatomic) NSString *name;
    @property (strong, nonatomic) NSNumber *level;
    @property (strong, nonatomic) Foo1 *foo1;

ご覧のとおり、Fooには、他の場所で定義したクラスFoo1のプロパティがあります。Foo1の実装は完了していませんが、基本的には、定義されているプロパティのセットにすぎません。(私はFoo1のinitメソッドを定義しませんでした。それが問題になる可能性がありますか?)Foo1の1つのプロパティは、次のとおりです。

// Foo1.h

    @property (strong, nonatomic) NSString*name;

次のFooメソッドが定義されています。

// Foo.m

    -(id) initWithName:(NSString *)name
                 level:(NSNumber *)level
                  foo1:(Foo1 *)foo1
    {
       self = [super init];
       if (self) {
         _name = name;
         _level = level;
         _foo1 = foo1;
         return self;
       }
       return nil;
    }

FooControllerのメソッドの1つは、makeRandomFooと呼ばれ、総称名、ランダムレベル、および静的に定義されたfoo1のインスタンス(サイズの意味で静的)を生成します。実装は次のとおりです。

// FooController.h

    #import "Foo.h"
    #import "Foo1.h"

    @interface FooController : NSObject

    @property (strong, nonatomic) Foo *foo;

    - (Foo *)makeRandomFoo:(Foo *)foo;

// FooContoller.m

    #import <stdlib.h>

    @implementation FooController

    @synthesize foo = _foo;

    - (Foo *)makeRandomFoo:(Foo *)foo
    {
      NSString *name = @"Random Foo 1";
      NSNumber *level = [NSNumber numberWithInt:(rand() / 100)]; 
      Foo1 *foo1 = [[foo1 alloc] init];
      foo = [[foo alloc] initwithName:name
                              atLevel:level
                             withFoo1:foo1];
      return foo;
    }

次に、ビューコントローラーFooViewController.h / mで、「Make Random Foo」という丸い長方形のボタンと、「nameLabel」、「levelLabel」、「foo1Label」という3つのラベルを作成しました。

「MakeRandomFoo」のメソッド(実装の下部)を示す前に、vcの定義と実装を示す必要があります。

// FooViewController.h

    @class Foo;
    @class FooController;

    @interface FooViewController : UIViewController

    @property (strong, nonatomic) Foo *foo;
    @property (strong, nonatomic) FooController *fooController;
    @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
    @property (weak, nonatomic) IBOutlet UILabel *levelLabel;
    @property (weak, nonatomic) IBOutlet UILabel *foo1Label;

    - (IBAction)randomizeButton;

// FooViewController.m

    - (id)reloadView
    {
       self.nameLabel.text = self.pet.name;
       self.levelLabel.text = [NSString stringWithFormat:@"%@",self.pet.level];
       self.foo1Label.text = self.pet.foo1.name;
       (remember when I told you about a property of foo1 called name?)
    }

    - (IBAction)randomizeButton
    {
      [self.petController makeRandomFoo:self.foo];
      [self reloadView];
    }

したがって、コードを実行してランダムボタンを押すと、名前とfoo1ラベルは空白のままになり、レベルラベルには(null)と表示されます。すべてのプロパティは合成されますが、私はそれらのカスタムセッターまたはゲッターを作成しませんでした。手伝ってくれませんか。

できるだけわかりやすく説明してみましたが、ご不明な点がございましたら、お気軽にお問い合わせください。

4

2 に答える 2

3

内のインスタンス変数に初期化パラメータを直接割り当てているため、メモリ管理ルールに従っていません[Foo init]。代わりに、(合成された)セッターメソッドを使用する必要があります。

-(id) initWithName:(NSString *)name
                 level:(NSNumber *)level
                  foo1:(Foo1 *)foo1
{
   self = [super init];
   if (self) {
     self.name = name;
     self.level = level;
     self.foo1 = foo1;
   }
   return self;
}

実装の結果として、インスタンス変数は保持されていないため、おそらく時期尚早にリリースされています。今は時期尚早なことはしたくないですか?

編集@property(ヘッダーファイルのキーワードを使用して宣言された)セッターメソッドを実装するには、すでに@synthensize行ったのと同じ方法を使用するだけです。FooController

@implementation Foo

@synthesize name = _name;
@synthesize level = _level;
@synthesize foo1 = _foo1;

-(id) initWithName:(NSString *)name
... etc ...

@end

編集2:もう少し調べてみると、[Foo init...]別の名前のパラメーターを使用してメソッドを呼び出しているようです。Foo1また、所有権をに渡したので、オブジェクトを解放する必要がありますFoonewまた、従来は、の新しいインスタンスを作成して返すときに、このメソッドを名前で開始する必要がありますFoo

これを試して、最後の行にブレークポイントを設定し、次のプロパティを検査できるかどうかを確認してくださいFoo

- (Foo *)newRandomFoo:(Foo *)foo
{
    NSString *name = @"Random Foo 1";
    NSNumber *level = [NSNumber numberWithInt:(rand() / 100)]; 
    Foo1 *foo1 = [[foo1 alloc] init];
    foo = [[foo alloc] initwithName:name
                              level:level
                               foo1:foo1];
    [foo1 release];
    return foo;
}
于 2012-05-08T17:16:51.323 に答える
0

これは私の推測に基づいてあなたがやりたいと思うことです(サンプルコードのすべてではありませんが、ほとんどの場合「Pet」を「Foo」に置き換えたようですので、フォローするのはかなり難しいです。投稿するだけではどうですか?あなたの本当のコード?)

makeRandomFooパラメータを取るべきではないので、次のようになります。

- (Foo *)makeRandomFoo
    {
      NSString *name = @"Random Foo 1";
      NSNumber *level = [NSNumber numberWithInt:(rand() / 100)]; 
      Foo1 *foo1 = [[Foo1 alloc] init];
      Foo *foo = [[Foo alloc] initwithName:name
                              atLevel:level
                             withFoo1:foo1];
      return foo;
    }

fooビューコントローラから呼び出すと、実際にはビューコントローラを「ランダムな」ものに置き換えたいように見えるので、次のようになります。

- (IBAction)randomizeButton
    {
      self.foo = [self.petController makeRandomFoo];
      [self reloadView];
    }

Foo1最後に、プロパティの実装によってはname、アクセサにデフォルトがない限り、何も含まれません。これは、割り当て/初期化するだけで、オーバーライドされたinitメソッドがないと言っているためです。

于 2012-05-08T18:46:05.327 に答える