Почему метод init устанавливает для этого ivar значение (null)?

#objective-c #cocoa-touch #instance-variables #init

#objective-c #cocoa-touch #переменные экземпляра #инициализация

Вопрос:

Я не понимаю, почему добавление init метода в мой контроллер представления устанавливает некоторые значения ivar (null) , когда некоторые данные передаются этому контроллеру. Вот код, который я использую для установки некоторых значений ivar и вызова связанного контроллера представления:

 MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];
 

В MyViewController , search_type ivar содержит @"buy" строку, сохраненную в предыдущем контроллере представления, как и ожидалось. Однако, когда я добавляю init метод ниже, search_type он всегда содержит (null) строку, когда я пытаюсь использовать его в MyViewController :

 (id)init
{
   self = [super init];
   if(self)
   {
        // some other code here
   }
   return self;
}
 

search_type объявляется в интерфейсе как:

 @property (nonatomic,retain) NSMutableString *search_type;
 

и синтезировать в файле реализации:

 @synthesize search_type;
 

Ответ №1:

Не совсем понятно, что вы пытаетесь сделать, но если вы говорите, что search_type в вашем init методе, который вы разместили // some other code here , это равно нулю, это потому, что ваш контроллер представления инициализируется перед установкой этого свойства.

Если вам нужно передать этот объект вашему контроллеру представления перед выполнением еще какого-либо кода, у вас есть несколько вариантов:

  • Создайте пользовательский инициализатор , например initWithSearchType: .
  • Создайте пользовательский параметр для этого свойства.
  • Выполните код в viewDidLoad , viewWillAppear или аналогичный метод.

Какой из них подходит, зависит от того, что именно вы делаете.

Комментарии:

1. то, что я пытаюсь сделать, это просто передать значение search_type другому контроллеру, но когда я добавляю метод init, переданное значение где-то очищается, так как при попытке использовать search_type оно теперь содержит пустую строку «» если я выделяю / инициализирую поиск, введите метод init или (null), если нет

2. Опубликуйте код, в котором вы пытаетесь использовать search_type , и опубликуйте свой полный init метод.

3. метод init содержит search_type = [[NSMutableString alloc] init]; затем в viewDidLoad я просто создаю NSLog(@»search_type=%@»,search_type); и он выводит search_type=»» с пустой строкой

Ответ №2:

search_type является изменяемым, выполняете ли вы инициализацию в методе init MyViewController?

Комментарии:

1. search_type является изменяемым, но я его не инициализировал. Должен ли я это делать ?

2. Да, если это изменяемый параметр, вы должны

3. единственное, что изменилось, теперь search_type содержит пустую строку «» вместо (null)

4. В заголовке MyViewController search_type является правильным?

5. Я получил -1, потому что я пытаюсь помочь

Ответ №3:

Вы не получаете доступ к переменной экземпляра в этом коде

 MyViewController *vc = [[MyViewController alloc] init];
MyViewController.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];
 

Вы создаете экземпляр с именем vc , но не используете его. Попробуйте это вместо этого:

 MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];
 

HTH.

Обновить

Трудно сказать, в чем проблема в коде, которым вы поделились. Мое другое предположение, основанное на том, чем вы поделились, состояло бы в том, чтобы убедиться, что вы правильно определили свое свойство и синтезировали его.

 // in the header file
@property(nonatomic, copy) NSMutableString *search_type;

// in your implementation
@synthesize search_type = m_search_type;
 

Если вы это сделали, вам, вероятно, следует поделиться большей частью своего MyViewController источника. Не имеет значения, инициализируете вы переменную в своем методе или нет init , потому что вы все равно присваиваете ей новое значение после создания ее экземпляра.

Комментарии:

1. Я просто допустил ошибку при вводе в stackoverflow … в любом случае, спасибо 🙂

2. Обновленный ответ с другой идеей. Не возражаете поделиться еще?

3. NS[Mutable]String свойства (или любой класс с изменяемым подклассом) обычно должны быть объявлены (copy) , чтобы вы не делились изменяемым объектом.

4. получил сообщение с «copy», поскольку я использовал retain Я собираюсь его протестировать, но откуда берется «m_search_type» в вашем коде?

5. Это просто присваивает имя сгенерированному ivar. Проверьте shinydevelopment.com/blog /…