Objective-c中的属性问题
我无法将类的实例分配给以下Objective-c中的属性问题,objective-c,ios,properties,uitableview,viewdidload,Objective C,Ios,Properties,Uitableview,Viewdidload,我无法将类的实例分配给以下UITableViewController子类: @interface MyTableViewController : UITableViewController </*usual protocols*/> @property (nonatomic, retain) MyClass *myClass; @end 问题是MyTableViewController的viewDidLoad中myClass为null为什么会发生这种情况? 编辑#1:我通过NSLo
UITableViewController
子类:
@interface MyTableViewController : UITableViewController </*usual protocols*/>
@property (nonatomic, retain) MyClass *myClass;
@end
问题是MyTableViewController的viewDidLoad
中myClass为null
为什么会发生这种情况?
编辑#1:我通过NSLogging检查nonNullInstanceOfMyClass是否为null
编辑#2:提供了更多代码。另外,viewdiload
似乎是在我按下视图控制器之前被调用的(这可能会导致问题……尽管看起来很奇怪)
编辑#3:通过移动
self.tableView.delegate=nil修复代码>和self.tableView.dataSource=nil代码>从init
到viewDidLoad
在实例化视图控制器和分配给属性之间,您在做什么viewDidLoad
在将视图控制器推到导航堆栈上时不一定会被调用-它会在需要加载视图时被调用。例如,NSLog(@“%@”,myTableViewController.view)
将触发viewDidLoad
,如果您在分配给属性之前执行了此操作,这将解释此行为
你能用实际代码代替近似值吗?您可能遗漏了一些重要的细节。从xib加载视图时会触发viewDidLoad
你有几个选择
最简单的方法是viewdidappease:method
- (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
}
或者,将出现以下视图:
另一个选择是让IB以这种方式为您加载类,它不为null。并将在viewDidLoad中提供:
您的MyClass需要是UIView
将UIView(作为占位符)放置到TableViewController的视图中所需的位置
然后在自定义类下的标识检查器中的Interface Builder中设置其类类型
最后,从IBOutlet拖动一个连接
@property (nonatomic, retain) IBOutlet MyClass *myClass;
到interface builder中的自定义类UIView
然后,当Interface builder初始化类时,它将使用该类的空白实例填充该属性
第三个选项是延迟加载属性
下面是我如何做懒负荷
//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方法将为您创建一个
编辑:
我将=\u myClass添加到@synthesis中,以将实例变量从属性中移除
使用myClass的这种方式将产生错误,您将被迫使用self.myClass获取属性访问器。更改以下行:
@property (nonatomic, retain) MyClass *myClass;
致:
那么,您是说您将其设置为非null实例,然后调用viewDidLoad,当您在该函数中检查myClass时,它为null?请描述您如何知道非NullInstanceOfMyClass不为null。经过进一步调查,似乎在我分配非NullInstanceOfMyClass之前调用了viewDidLoad
。但是我在推视图控制器之前分配了nonNullInstanceOfMyClass。@MrMusic:这个发现没有回答问题吗?那么问题要么在视图控制器的实例化中,要么在该点和属性分配之间。在某些情况下,您正在访问视图控制器的视图
属性,这将启动viewDidLoad
@sashang,这肯定会有所帮助。但我不知道为什么在推送视图之前会调用viewDidLoad。请参阅我提供的附加示例代码。@Jim请参阅我提供的附加代码。我想了解为什么在推送视图控制器之前调用viewDidLoad
。我的init
方法中唯一的“特殊”代码是self.tableView.delegate=self代码>和self.tableView.dataSource=self代码>我应该提到我根本没有使用interface builder.well viewDidLoad应该在类初始化并准备好使用时启动。如果不设置属性,它在viewDidLoad中将为null。一个懒惰的加载器怎么样。我会更新Example,但不确定它是否会更新,但由于您正在调用的类之外创建myClass实例,因此该类实际上不是所有者。使用“retain”生成的代码可能会释放您的实例
@property (nonatomic, retain) MyClass *myClass;
@property (nonatomic, assign) MyClass *myClass;