Как добавить указатель на настраиваемый подкласс NSObject в NSMutableArray?

Для следующего фрагмента кода из 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 - это @property (неатомарное, сильное) самого себя типа 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.

ЧТО ДЕЙСТВИТЕЛЬНО ПРОИСХОДИТ: при последующем запросе self.foo.arrayOfObjects.count возвращается 0. Я не верю, что это проблема с инициализацией arrayOfObjects, поскольку у меня есть ленивое создание экземпляров.

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


person Ken M. Haggerty    schedule 05.05.2012    source источник
comment
Что именно вы имеете в виду под словом «не работает»? Объясните (1) чего вы ожидали и (2) что произошло на самом деле.   -  person Kurt Revis    schedule 06.05.2012
comment
Добавьте: NSLog(@"foo: %@", self.foo.arrayOfObjects); и NSLog(@"sourceOfObjects: %@", self.sourceOfObjects.objectArray); в начало метода, чтобы убедиться, что он не равен нулю. Поскольку вы не верите, что это проблема инициализации, почему бы нам не убедиться, ведь это должно работать. :)   -  person lnafziger    schedule 06.05.2012
comment
Круто, я не знал, что у тебя такое получится. Конечно, вы правы :) Я не знал, что нулевые объекты имеют счетчик 0 вместо счетчика нуля. Однако я не понимаю, почему self.foo.arrayOfObjects не инициализируется должным образом, а self.sourceOfObjects.arrayOfObjects в порядке.   -  person Ken M. Haggerty    schedule 06.05.2012
comment
Какова практика StackOverflow, если вы обнаружите, что задаете неправильный вопрос? Следует ли удалить вопрос и задать правильный вопрос повторно? Следует ли отредактировать вопрос, чтобы отметить? Или вы должны просто оставить вопрос на месте, даже если он не кажется очень полезным?   -  person Ken M. Haggerty    schedule 06.05.2012
comment
@KenHaggerty, это зависит от обстоятельств. Если ваш вопрос по-прежнему остается хорошим, оставьте его и примите лучший ответ. Думайте о SO как о чем-то большем, чем просто сайт вопросов и ответов, это больше похоже на вики по программированию, управляемую сообществом. Даже если ваш вопрос не тот, который вы собирались задать, он может быть кому-то полезен когда-нибудь в будущем.   -  person slayton    schedule 07.05.2012


Ответы (2)


Я забыл добавить ленивое создание экземпляра 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, а добавление объекта в значение NULL приводит к получению нулевого объекта.

person Ken M. Haggerty    schedule 07.05.2012

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

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

person thundersteele    schedule 06.05.2012
comment
Хм, я не вижу в его вопросе ничего, что могло бы заставить нас поверить, что он пытается сохранить NSObject**. Что привело вас к такому выводу? - person inspector-g; 06.05.2012
comment
Я интерпретировал объяснение свойства connectedObject таким образом. Я не привык к тому, что люди называют NSObject указателем на объект типа NSObject. - person thundersteele; 06.05.2012
comment
Да, полагаю, автору было бы лучше вместо этого сказать, что sourceOfObjects является @property (nonatomic, strong) из self типа NSObject*. Тем не менее, я думаю, что он имел в виду NSObject* (вместо NSObject), поэтому я сомневаюсь, что он пытается использовать несколько уровней указателей. - person inspector-g; 06.05.2012