#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 /…