将属性传递给函数并设置要保留的值

时间:2009-10-09 19:35:38

标签: iphone objective-c

我有两个属性设置为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;

1 个答案:

答案 0 :(得分:0)

您是否尝试将新ModelViewController分配给maleModelViewControllerfemaleModelViewController?如果是这样的话,那你就错了。

坦率地说,我完全取消了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编辑它。您将分配一个死引用,一旦您尝试使用它就会使程序崩溃。