2012-05-05 3 views
1

:CustomButton•NSObjectカスタムサブクラスへのポインタをNSMutableArrayに追加する方法は? ViewController.mから次のコードスニペットについて

- (IBAction)buttonAction:(id)sender 
{ 
    CustomButton *button = (CustomButton *)sender; 
    button.associatedObject = [self.sourceOfObjects.objectArray lastObject]; 
    [self.foo.arrayOfObjects addObject:button.associatedObject]; // this does not work? 
} 

はUIButtonのサブクラスであり、@propertyタイプNSObjectののオブジェクトへのポインタである(非アトミック強い)associatedObjectを有しています。

•sourceOfObjectsは、NSObjectのサブクラスであるMyCustomObject型のselfの@property(非構造体、強)です。

•objectArrayは、NSMutableArray型のsourceOfObjectsの@property(非構造体、強)です。

•fooはNSObjectのサブクラスであるMyCustomObject型のViewControllerの@property(非構造体、強)です。

•arrayOfObjectsはNSMutableArray型のfooの@property(非構造体、強)です。

質問:なぜ私はbutton.associatedObjectからのポインタをself.foo.arrayOfObjectsに追加できないので、button.associatedObjectと同じオブジェクトを指しているself.foo.arrayOfObjectsのポインタを持っていますか?

私はそれに続いて[self.foo.arrayOfObjects lastObject]を要求すると、button.associatedObjectも指すオブジェクトを返す必要があります。

実際に起こっていること:その後、self.foo.arrayOfObjects.countを要求すると、0が返されます。レイアウト時のインスタンス化があるため、arrayOfObjectsの初期化に関する問題ではないと思います。

私はこの質問を正確に表現して、正確であるようにしたいと考えています。 :)

+0

「うまくいかない」と正確にはどういう意味ですか? (1)あなたが何が起こると予想されるか、(2)実際に何が起こったかを説明してください。 –

+0

編集ありがとう。 –

+3

「NSLog(@ "foo:%@"、self.foo.arrayOfObjects); and NSLog(@ "sourceOfObjects:%@"、self.sourceOfObjects.objectArray); 'メソッドの先頭にそれは無しではないことを確かめてください。あなたは「初期化の問題だとは思わない」ので、これが機能するはずなので、私たちは確かにしないでください。 :) – lnafziger

答えて

1

MyCustomObjectクラスの定義内でself.foo.arrayOfObjectsの遅延インスタンス化を追加するのを忘れていました。 :Sは何その手段は、ファイル内で次の行が欠落していたということですMyCustomObject.m:arrayOfObjectsが遅延しViewController.m内からself.foo.arrayOfObjectsにオブジェクトを追加し、MyCustomObjectクラス内でインスタンス化されていなかったので

- (void)setArrayOfObjects:(NSMutableArray *)arrayOfObjects 
{ 
    _arrayOfObjects = arrayOfObjects; 
} 

- (NSMutableArray *)arrayOfObjects 
{ 
    if (!_arrayOfObjects) _arrayOfObjects = [[NSMutableArray alloc] init]; 
    return _arrayOfObjects; 
} 

をself.foo.arrayOfObjectsがまだnullであり、nullにオブジェクトを追加するとnullオブジェクトが取得されたため、何も行われませんでした。

0

ここで間違っているかもしれませんが、NSObjectとそのすべてのサブクラスは実際にはポインタです。したがって、明示的にNSObjectへのポインタを作成し、そのポインタをaddObjectに渡すと、メソッドに予期しているオブジェクトへのポインタではなくポインタにポインタが渡されます。

associatedObjectをどのように定義しますか?

+2

うーん、私は彼が 'NSObject ** 'を格納しようとしていると信じさせるために彼の質問に何も表示されません。この結論に導かれたのは何ですか? –

+0

このように、associatedObjectプロパティの説明を解釈しました。私はNSObjectを "NSObject型のオブジェクトへのポインタ"として参照する人々に慣れていません。 – thundersteele

+0

ええ、著者が "' sourceOfObjects'は** NSObject * '**"型の 'self'の' @property(nonatomic、strong) 'であると言う方が良いでしょう。それにもかかわらず、私は彼が(NSObject'の代わりに) 'NSObject *'を意味していると思うので、私は彼が複数のレベルのポインタを使用しようとしているのか疑問です。 –

関連する問題