什么时候分配/初始化一个ivar,什么时候不去

时间:2011-02-27 21:09:35

标签: objective-c ios instance-variables

所有

在Apple的示例代码“DateCell”

http://developer.apple.com/library/ios/#samplecode/DateCell/Introduction/Intro.html

ivar“pickerView”在MyTableViewController.h中声明如下:

@interface MyTableViewController : UITableViewController
{
@private
    UIDatePicker *pickerView;
    UIBarButtonItem *doneButton;    // this button appears only when the date picker is open

    NSArray *dataArray;

    NSDateFormatter *dateFormatter;
}

@property (nonatomic, retain) IBOutlet UIDatePicker *pickerView; 
...

它在类文件MyTableViewController.m中合成,如下所示:

@implementation MyTableViewController

@synthesize pickerView, doneButton, dataArray, dateFormatter;
...

当这个应用程序运行时,我可以将NSLog(@"%@",pickerView)插入到ViewDidLoad中,并且确实看到,ivar pickerView是真实的并且具有值。但是,没有任何地方可以使用这个类alloc / init pickerView。这就是问题的根源:如果不明确地完成它会如何完成?

好吧,我天真地将这些东西复制到我的RootViewController.h和.m文件中,并确认我可以这样做,但是pickerView固执地保持未初始化(并且我的NSLog调用返回“(nil)”作为其值)no重要的是我没有明确地分配/启动它。当然RootViewController正在实例化,或者RootView不会出现,对吧?因此,我的pickerView不应该像苹果那样出现吗?

那么......我是否必须手动分配/初始化pickerView实例变量?如果是这样,Apple在做什么呢?或者他们是怎么做的呢?

我想我在这里遗漏了一些非常基本的东西,但我不知道它是什么。我在Interface Builder或XCode中看不到我和他们之间看起来不同的任何东西,但我现在已经有了隧道视觉,再也看不清楚了。

谢谢,

比尔

2 个答案:

答案 0 :(得分:3)

此行上的IBOutlet修饰符是关键...

@property (nonatomic, retain) IBOutlet UIDatePicker *pickerView; 

IBOutlet是一个装饰器,指示在加载相应的xib(Interface Builder)文件时将挂接/连接/初始化对象。您正在查找的示例应用程序将包含一个UITableViewController,它是一个与UIPickerView连接的xib。

您可以选择创建自己的自定义xib文件并连接到UIPickerView实例,也可以自己手动初始化选择器。

答案 1 :(得分:0)

Interface Builder(nib或xib)自动处理IBOutlet ivar与组件的连接。

  

IBOutlet是一个特殊的关键字   仅用于告诉Interface Builder   处理实例变量或属性   作为出路。它实际上被定义为   什么都没有,所以它对编译没有影响   时间。