Цель c имущественный вопрос

В моем файле Settings.h у меня есть строка

@property (nonatomic, retain) NSArray * connections;

Также в файле Settings.m есть импорт:

#import "Settings.h"

и позже я предоставляю реализацию

- (NSArray*)connections 
{
    return connections;
}
- (void)setConnections:(NSArray*)_connections
{
    connections = _connections; 
    // do some more stuff
}

Но как в геттере, так и в сеттере я получаю сообщение об ошибке use of undeclared identifier 'connections'. Я понятия не имею, что я делаю неправильно, поэтому любая ваша помощь будет очень признательна!


person Solomiya    schedule 13.02.2012    source источник
comment
Кстати, сеттер для неатомарного сохраняемого свойства выглядит иначе! Ожидайте неожиданных проблем с памятью.   -  person jrtc27    schedule 13.02.2012
comment
Вы имеете в виду, что я должен использовать connections = [_connections retain];?   -  person Solomiya    schedule 13.02.2012


Ответы (2)


Вы совершенно правильно пытаетесь использовать ивар (называемый connections) в качестве резервного хранилища для вашей собственности, также называемой connections;

Чтобы заставить его работать, вы должны просто объявить ivar следующим образом:

// Settings.h

NSArray * connections;

Он должен находиться между фигурными скобками объявления класса, например:

@interface MyClass : MySuperClass {
    NSArray *connections;
    // More ivars...
}

@property (nonatomic, assign) NSArray *connections;

@end
person Monolo    schedule 13.02.2012
comment
Да, я уже добавил и все заработало :) Спасибо за помощь! - person Solomiya; 13.02.2012

В Settings.h добавьте переменную экземпляра NSArray *connections; (если ее еще нет), затем в Settings.m чуть ниже @implementation добавьте следующее:

@dynamic connections;

Другой вариант — удалить ваши методы доступа и выбрать @synthesize connections; вместо dynamic, и методы доступа будут созданы для вас.

person Simon    schedule 13.02.2012
comment
да, было бы разумно удалить мои собственные методы доступа, но мне нужно указать еще несколько действий в сеттере, которые я не упомянул здесь. - person Solomiya; 13.02.2012
comment
Хм, когда я добавляю @dynamic connections;, ошибка не исчезает. - person Solomiya; 13.02.2012
comment
О, нет-нет, я ошибся :) Теперь все отлично работает! Большое тебе спасибо! - person Solomiya; 13.02.2012
comment
Какая потребность в @dynamic connections? - person Monolo; 13.02.2012
comment
Хм, не знаю - только что попробовал удалить и ничего не изменилось, все работает как раньше - person Solomiya; 13.02.2012
comment
Насколько я понимаю, @dynamic необходим для доступа к connections как к свойству, например. в привязках или с использованием нотации mySetting.connection. Из того, что я читал, вы используете его, когда хотите сами написать методы доступа к свойствам. Таким образом, [mySetting connections] будет работать без @dynamic, а mySetting.connections — нет. Хотя я могу ошибаться в этом. - person Simon; 13.02.2012
comment
Я думал, что @dynamic требуется, если я собираюсь определить методы доступа позже, например. в подклассах. Что насчет нотации, в моем приложении я пишу currentSettings.connections = [fields objectForKey:@"connections"]; и все работает нормально - person Solomiya; 13.02.2012
comment
Да, тут я явно не прав. stackoverflow.com/a/4621968/222245 предлагает довольно хорошее описание @dynamic. - person Simon; 13.02.2012
comment
Вы знаете, вероятно, нет - stackoverflow.com/questions/4524954/ :) Как я понял, это всего лишь вопрос вашего стиля программирования - person Solomiya; 13.02.2012