1

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?
}

• CustomButton は UIButton のサブクラスであり、NSObject タイプのオブジェクトへのポインターである @property (非アトミック、強力) associatedObject を持ちます。

• sourceOfObjects は、NSObject のサブクラスである MyCustomObject 型の self の @property (非アトミック、強力) です。

• objectArray は、NSMutableArray タイプの sourceOfObjects の @property (nonatomic、strong) です。

• foo は、NSObject のサブクラスである MyCustomObject タイプの ViewController の @property (非アトミック、強力) です。

• arrayOfObjects は、NSMutableArray 型の foo の @property (非アトミック、強力) です。

質問: button.associatedObject から self.foo.arrayOfObjects へのポインターを追加できない理由がわかりました。

予想されること: その後 [self.foo.arrayOfObjects lastObject] を要求すると、button.associatedObject も指すオブジェクトが返されるはずです。

実際に何が起こるか: その後、self.foo.arrayOfObjects.count を要求すると 0 が返されます。遅延インスタンス化が行われているため、arrayOfObjects の初期化に問題があるとは思いません。

この質問を正確に言い表し、正確であることを願っています。:)

4

2 に答える 2

1

クラス MyCustomObject の定義内に、self.foo.arrayOfObjects の遅延インスタンス化を追加するのを忘れていました。:S つまり、ファイル MyCustomObject.m 内で次の行が欠落していたことを意味します。

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

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

arrayOfObjects は MyCustomObject クラス内で遅延インスタンス化されていないため、ViewController.m 内から self.foo.arrayOfObjects にオブジェクトを追加しても何も起こりませんでした。

于 2012-05-07T00:33:13.487 に答える
0

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

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

于 2012-05-06T00:02:11.493 に答える