2012-05-05 117 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'),所以我懷疑他試圖使用多級指針。 –

相關問題