У меня есть следующая настройка в одном из моих классов, где я передаю NSMutableDictionary в качестве параметра инициализатору, а затем присваиваю его переменной controls.
Я считаю, что поведение заключается в копировании элементов NSMutableDictonary в controls, но мне нужно передать его как ссылку, чтобы внесенные изменения отражались в классе, который передает словарь в MenuViewCell. Это всегда меня чертовски смущает, как бы я передал NSMutableDictionary в качестве ссылки?
MenuViewCell.h
@interface MenuViewCell : UITableViewCell
{
NSMutableDictionary *_controls;
}
@property(nonatomic, copy) NSMutableDictionary *controls;
MenuViewCell.m
@synthesize controls = _controls;
- (id)initWithControls:(NSMutableDictionary *)controls
{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
if (self)
{
self.controls = controls;
}
return self;
}
- (void) setControls:(NSMutableDictionary *)controls
{
if (_controls != controls)
{
_controls = [controls mutableCopy];
}
}





Ваша проблема заключается в использовании copy в свойстве и использовании mutableCopy в установщике. Сделайте свойство strong.
Вам также не нужны @synthesize или явная переменная экземпляра.
MenuViewCell.h
@interface MenuViewCell : UITableViewCell
@property(nonatomic, strong) NSMutableDictionary *controls;
MenuViewCell.m
- (id)initWithControls:(NSMutableDictionary *)controls
{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
if (self)
{
_controls = controls;
}
return self;
}
Нет необходимости переопределять сеттер.
Спасибо, по какой-то причине у меня были шоры, когда я думал, что вы можете заявить об этом только с помощью копии.
copy очень распространен, потому что во многих случаях вам нужна реальная копия, чтобы изменения в оригинале не испортили свойство. Но, очевидно, в вашем случае вы хотите, чтобы изменения появились.
[self.controls setObject:control forKey: subtypeNumber]; Это все еще должно работать, и я должен увидеть изменения в родительском классе? По какой-то причине это не работает для меня, я могу вытащить объект с помощью ключа, но когда я пытаюсь что-то сделать с ним (например, установить текст меток), ничего не происходит.
Пожалуйста, опубликуйте новый вопрос с достаточными подробностями, демонстрирующими проблему, с которой вы столкнулись.
Я бы рекомендовал использовать модель вместо словаря. Также удалите строку
NSMutableDictionary *_controls;и создайте свойствоstrongвместоcopy. Когда вы делаете копию, она не сохраняет ту же ссылку, только назначение будет работать.