在Objective-c中遇到属性问题

时间:2011-09-23 00:03:28

标签: objective-c ios properties uitableview viewdidload

我无法将类的实例分配给以下UITableViewController子类:

@interface MyTableViewController : UITableViewController </*usual protocols*/>
@property (nonatomic, retain) MyClass *myClass;
@end

我正在将MyClass的非null实例分配给MyTableViewController的实例,如下所示:

MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];
MyClass *nonNullInstanceOfMyClass = [[MyClass alloc] init];

myTableViewController.myClass = nonNullInstanceOfMyClass;

[self.navigationController pushViewController:myTableViewController animated:YES];

[nonNullInstanceOfMyClass release];
[myTableViewController release];

问题是myClass是MyTableViewController的null中的viewDidLoad为什么会这样?

编辑#1 :我通过NSLogging检查nonNullInstanceOfMyClass是否为空。

编辑#2 :提供更多代码。在我推动视图控制器之前似乎也调用viewDidLoad(这可能会导致问题......虽然看起来很奇怪)。

编辑#3 :通过将self.tableView.delegate = nil;self.tableView.dataSource = nil;init移至viewDidLoad来修复。

3 个答案:

答案 0 :(得分:0)

您是否在实例化视图控制器和分配属性之间做了什么?将视图控制器推入导航堆栈时,不一定会调用viewDidLoad - 只要需要加载视图,就会调用它。因此,例如,NSLog(@"%@", myTableViewController.view);会触发viewDidLoad,如果您在分配属性之前执行此操作,则可以解释此行为。

您可以发布实际代码而不是近似值吗?你可能会遗漏重要的细节。

答案 1 :(得分:0)

从xib加载View时会触发viewDidLoad。

你有几个选择。

最简单的是viewDidAppear:方法

- (void)viewDidAppear:(BOOL)animated
{
    // Handle what you want for when your view has become visible. 
    // This may happen more then once. So a flag for the first time will
    // give you a sufficient Limit for Initialization
}

或者是viewWillAppear:

另一种选择是让IB以这种方式加载Class,而不是null。并将在viewDidLoad中提供:

你的MyClass需要是一个UIView。

将UIView(作为占位符)放入TableViewController的View所在的位置。

然后在Custom Class中的Identity Inspector中的Interface Builder中设置其类类型。

最后,您从IBOutlet

拖动连接
@property (nonatomic, retain) IBOutlet MyClass *myClass;

到界面构建器

中的自定义类UIView

然后,当“接口”构建器初始化您的类时,它将使用该类的空白实例填充该属性。

第三个选项是延迟加载属性

这是我如何延迟加载

//we will take for granted that your @property is in the header
//and the following Synthesize is on the class
@synthesize myClass=_myClass; // setting instance variable to avoid confusion 
- (MyClass*) myClass
{
    if (_myClass == nil) _myClass = [[MyClass alloc] init];//Create a default instance and retain it
    return _myClass;
}

然后你使用self.myClass,你的getter方法将为你创建一个。

修改

我将= _myClass添加到@synthesize以将实例变量更改为远离属性

这样使用myClass会产生错误,你将被迫使用self.myClass来获取属性访问器。

答案 2 :(得分:-1)

更改以下行:

@property (nonatomic, retain) MyClass *myClass;

为:

@property (nonatomic, assign) MyClass *myClass;