Как передать NSMutableDictionary в качестве ссылки?

У меня есть следующая настройка в одном из моих классов, где я передаю 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];
    }
}

Я бы рекомендовал использовать модель вместо словаря. Также удалите строку NSMutableDictionary *_controls; и создайте свойство strong вместо copy. Когда вы делаете копию, она не сохраняет ту же ссылку, только назначение будет работать.

TheTiger 30.05.2019 07:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема заключается в использовании 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;
}

Нет необходимости переопределять сеттер.

Спасибо, по какой-то причине у меня были шоры, когда я думал, что вы можете заявить об этом только с помощью копии.

NSMoron 30.05.2019 08:20
copy очень распространен, потому что во многих случаях вам нужна реальная копия, чтобы изменения в оригинале не испортили свойство. Но, очевидно, в вашем случае вы хотите, чтобы изменения появились.
rmaddy 30.05.2019 08:22

[self.controls setObject:control forKey: subtypeNumber]; Это все еще должно работать, и я должен увидеть изменения в родительском классе? По какой-то причине это не работает для меня, я могу вытащить объект с помощью ключа, но когда я пытаюсь что-то сделать с ним (например, установить текст меток), ничего не происходит.

NSMoron 30.05.2019 08:50

Пожалуйста, опубликуйте новый вопрос с достаточными подробностями, демонстрирующими проблему, с которой вы столкнулись.

rmaddy 30.05.2019 18:15

Другие вопросы по теме