2012-05-05 68 views
1

对于从ViewController.m下面的代码片断:如何将NSObject自定义子类的指针添加到NSMutableArray?

- (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(非原子,强)的AssociatedObject这是一个指向类型NSObject的的对象。

•sourceOfObjects是类型为MyCustomObject的@property(nonatomic,strong),它是NSObject的一个子类。

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

•foo是MyCustomObject类型的ViewController的@property(nonatomic,strong),NSObject的子类。

•arrayOfObjects是类型NSMutableArray的foo的@property(nonatomic,strong)。

问题:任何想法为什么我无法将button.associatedObject指针添加到self.foo.arrayOfObjects,以便在self.foo.arrayOfObjects中有一个指向与button.associatedObject相同的对象的指针?

我期望发生什么:如果我随后询问[self.foo.arrayOfObjects lastObject],它应该返回button.associatedObject也指向的对象。

实际发生了什么:随后询问self.foo.arrayOfObjects.count返回0.我不相信这是arrayOfObjects的初始化问题,因为我有懒惰的实例化。

我希望我准确地说出了这个问题,试图做到精确。 :)

+0

你是什么意思的“不工作”?解释(1)你预期会发生什么,以及(2)实际发生了什么。 –

+0

编辑,谢谢。 –

+3

Add:'NSLog(@“foo:%@”,self.foo.arrayOfObjects);''和'NSLog(@“sourceOfObjects:%@”,self.sourceOfObjects.objectArray);'在方法的开头确定它不是零。既然你“不相信这是初始化的问题”,为什么我们不确定,因为这应该工作。 :) – lnafziger

回答

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添加一个对象可以获得一个空对象。

0

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

你如何定义associatedObject

+2

嗯,我没有看到他的问题中的任何事情,导致我们相信他正在试图存储一个'NSObject **'。是什么使你得出这个结论? –

+0

我以这种方式解释了associatedObject属性的解释。我不习惯将NSObject引用为“指向NSObject类型的对象的指针”。 – thundersteele

+0

是的,我猜想作者应该说“sourceOfObjects'是一个'@property(nonatomic,strong)',而不是类型**'NSObject *'**'。尽管如此,我认为他的意思是'NSObject *'(而不是'NSObject'),所以我怀疑他试图使用多级指针。 –

相关问题