Передача свойства в функцию и установка значения для сохранения - PullRequest
0 голосов
/ 09 октября 2009

У меня есть два свойства, настроенные как ViewControllers, каждый из которых использует свой файл NIB. (Мужские и женские модели будут функционировать одинаково, но настраиваются визуально по-разному.) Я хочу иметь одну функцию для создания ViewController на основе имени NIB и ViewController, которые я передаю.

То, что происходит, - свойство ViewController не сохраняется. Если я добавлю фактическое имя свойства в функцию и задам его, viewController устанавливается и сохраняет ViewController. Вот что у меня есть в файле .m (показывает только то, что нужно для получения справки). Я сохранил две строки комментариев, которые пытался определить, где была проблема.

@synthesize femaleModelViewController;
@synthesize maleModelViewController;


    - (void) loadModelViewControllerWithModelType:(NSString*) model ModelView:(ModelViewController *)modelViewController {
        ModelViewController *viewController = [[ModelViewController alloc] initWithNibName:model bundle:nil];
    //  [self setFemaleModelViewController:viewController];  // I don't want to set the property here, I want to be able to pass it as an argument.
        modelViewController = viewController;
    //  [modelViewController retain]; // I even tried to retain it do see if would but it doesn't.
        [viewController release];
    }

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self loadModelViewControllerWithModelType:@"FemaleModel" ModelView:femaleModelViewController];
        [self loadModelViewControllerWithModelType:@"MaleModel" ModelView:maleModelViewController];


}

В файле .h мои свойства настроены так:

@property (nonatomic, retain) ModelViewController *femaleModelViewController;
@property (nonatomic, retain) ModelViewController *maleModelViewController;

1 Ответ

0 голосов
/ 09 октября 2009

Вы пытаетесь назначить новые ModelViewController для maleModelViewController и femaleModelViewController? Если это так, то вы поступаете неправильно.

Честно говоря, я бы полностью избавился от метода loadModelViewControllerWithModelType:modelView:. Все, что вам нужно сделать в viewDidLoad, это:

maleModelViewController = [[ModelViewController alloc] initWithNibName:@"MaleModel"];
femaleModelViewController = [[ModelViewController alloc] initWithNibName:@"FemaleModel"];

(Предполагается, что maleModelViewController и femaleModelViewController являются переменными экземпляра, поддерживающими свойства одного и того же имени.)

Когда вы передаете maleModelViewController и femaleModelViewController, вы не передаете ссылку на эти переменные, вы передаете их значения. Так как они не были инициализированы, все, что вы делаете, передаете nil. Чтобы сделать то, что вы пытаетесь сделать, вам нужно передать переменные указатель (т.е. объявить параметр как ModelViewController **, передать его как &maleModelViewController и &femaleModelViewController и назначить он использует *modelViewController = viewController. Если вы привыкли использовать дружественные для передачи по ссылке языки, такие как C # или Java, вам следует прочитать о том, как это работает в C. .

ОДНАКО, это все еще полное излишество для того, что вы пытаетесь сделать здесь.

Кроме того, ваш код все равно не будет работать, потому что вы поворачиваетесь и отпускаете viewController. Это может привести к немедленному освобождению его, поскольку единственное упоминание о нем пришло от вас, когда вы alloc его редактировали. Вы будете назначать мертвую ссылку, которая приведет к сбою вашей программы, как только вы попытаетесь ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...