2012-05-05 1 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 - это @property (неатомный, сильный) self типа MyCustomObject, подкласс NSObject.

• objectArray - это свойство @property (неатомное, сильное) sourceOfObjects типа NSMutableArray.

• foo - это @property (неатомный, сильный) ViewController типа MyCustomObject, подкласс NSObject.

• arrayOfObjects - это @property (неатомный, сильный) foo типа NSMutableArray.

ВОПРОС: Любая идея, почему я не могу добавить указатель из button.associatedObject в self.foo.arrayOfObjects, чтобы у меня есть указатель в self.foo.arrayOfObjects, который указывает на тот же объект, что и button.associatedObject?

ЧТО Я ОЖИДАЮ, ЧТОБЫ ПРОИЗОЙТИ: Если я затем попрошу [self.foo.arrayOfObjects lastObject], он должен вернуть объект, на который указывает button.associatedObject.

WHAT ACTUALLY HAPPENS: Впоследствии запрашивается self.foo.arrayOfObjects.count возвращает 0. Я не верю, что это проблема с инициализацией arrayOfObjects, поскольку у меня есть ленивый экземпляр на месте.

Надеюсь, я сформулировал этот вопрос точно, постарался быть точным. :)

+0

Что именно вы подразумеваете под «не работает»? Объясните (1), что вы ожидали, и (2) что на самом деле произошло. –

+0

Отредактировано, спасибо. –

+3

Добавить: 'NSLog (@" foo:% @ ", self.foo.arrayOfObjects);' и 'NSLog (@" sourceOfObjects:% @ ", self.sourceOfObjects.objectArray);' в начало метода для создания что это не ноль. Поскольку вы «не верите, что это проблема с инициализацией», почему бы нам не убедиться, так как это должно работать. :) – lnafziger

ответ

1

Я забыл добавить ленивый экземпляр для self.foo.arrayOfObjects в определении класса MyCustomObject. : S Что это означает, что в файле MyCustomObject.m следующие строки отсутствовали:

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

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

Поскольку arrayOfObjects не лениво инстанцирован в классе MyCustomObject, добавление объекта к self.foo.arrayOfObjects изнутри ViewController.m ничего не делал, потому что self.foo.arrayOfObjects по-прежнему был нулевым, а добавление объекта в null запрашивает нулевой объект.

0

Возможно, я ошибаюсь, но NSObject и все его подклассы на самом деле являются указателями. Поэтому, если вы явно создаете указатель на NSObject, а затем передаете этот указатель на addObject, вы передаете указатель указателю, а не указатель на объект, который ожидает этот метод.

Как вы определяете associatedObject?

+2

Хмм, я ничего не вижу в его вопросе, чтобы заставить нас поверить, что он пытается хранить «NSObject **». Что привело вас к такому выводу? –

+0

Я интерпретировал объяснение свойства relatedObject таким образом. Я не привык к людям, ссылающимся на NSObject как «указатель на объект типа NSObject». – thundersteele

+0

Да, я полагаю, было бы лучше, если бы автор сказал: «sourceOfObjects» - это «@property (неатомный, сильный)' 'self' типа **' NSObject * '**". Тем не менее, я думаю, он имел в виду «NSObject *» (вместо «NSObject»), поэтому я сомневаюсь, что он пытается использовать несколько уровней указателей. –