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 的子类,并且具有@property(非原子,强)关联对象,它是指向NSObject 类型对象的指针。

• sourceOfObjects 是MyCustomObject 类型的self 的@property(非原子,强),是NSObject 的子类。

• objectArray 是NSMutableArray 类型的sourceOfObjects 的@property(非原子,强)。

• foo 是MyCustomObject 类型ViewController 的@property(非原子,强),是NSObject 的子类。

• arrayOfObjects 是NSMutableArray 类型的foo 的@property(非原子,强)。

问题:知道为什么我不能将 button.associatedObject 中的指针添加到 self.foo.arrayOfObjects 以便我在 self.foo.arrayOfObjects 中有一个指针指向与 button.associatedObject 相同的对象吗?

我期望会发生什么:如果我随后要求 [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 添加一个对象没有任何作用,因为 self.foo.arrayOfObjects 仍然为 null,向 null 添加一个对象会产生一个 null 对象。

于 2012-05-07T00:33:13.487 回答
0

我在这里可能错了,但是 NSObject 和它的所有子类实际上都是指针。因此,如果您显式创建一个指向 NSObject 的指针,然后将该指针传递给addObject,则您将指针传递给该指针,而不是该方法所期望的指向 Object 的指针。

你怎么定义associatedObject

于 2012-05-06T00:02:11.493 回答