2009-10-09 33 views
0

我有两个属性设置为ViewControllers,每个属性都使用不同的NIB文件。 (男性和女性模型,将功能相同,但设置视觉上不同。)我想有一个函数来创建基于我传入的NIB名称和ViewController的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; 

回答

0

你们是不是要指定一个新ModelViewControllermaleModelViewControllerfemaleModelViewController?如果是这样,你就会以错误的方式去做。

坦率地说,我会完全废除loadModelViewControllerWithModelType:modelView:方法。所有你需要在viewDidLoad做的是这样的:

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

(这假定maleModelViewControllerfemaleModelViewController是实例变量支持同名的属性)

当您在maleModelViewControllerfemaleModelViewController传球,你没有传递对这些变量的引用,你传递了它们的值。由于它们尚未初始化,因此您所做的只是传入nil。要做你想做的事情,你需要将指针传递给变量(即声明参数为ModelViewController **,将其作为&maleModelViewController&femaleModelViewController传递给它,并使用*modelViewController = viewController分配它。如果您习惯于使用像C#或Java这样的引用友好的通用语言,你应该阅读它如何在C中工作(Objective-C和C中的规则相同)。

然而,这仍然是完整的过度技术对于你想在这里做什么

此外,你的代码仍然不能工作,因为你转身发布viewController。这将导致它立即释放,因为你有唯一的引用它来自于当你alloc编辑它。你会分配一个死的引用,只要你尝试使用它,就会使你的程序崩溃。

+0

谢谢!是的,我完全忘记了通过地址和价值。在Objective-C和C#之间来回切换可以做到这一点。 是的这个示例看起来像是过度杀伤性的,但是这个方法会比简单地声明它更多。如果我保留在这里,它应该工作正确吗? –

+0

保留在哪里?有两种方法可以获得对象的保留引用:“alloc”或“保留”它。如果你已经分配了它,你也不需要保留它。另外,即使你有更多的初始化工作,它也会属于视图控制器的'initWithNibName:owner:'方法中,而不是任何类。不要将你的课程紧紧地绑在一起,否则整个应用程序变得脆弱。 – Alex

相关问题