Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-c中的属性问题_Objective C_Ios_Properties_Uitableview_Viewdidload - Fatal编程技术网

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;