【问题标题】:When to alloc/init an ivar, and when not to何时分配/初始化 ivar,何时不分配
【发布时间】:2011-07-05 09:24:56
【问题描述】:

全部,

在 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)”作为它的值)不不管我尝试什么,都没有明确分配/初始化它。当然 RootViewController 正在被实例化,或者 RootView 不会出现,对吧?那么我的 pickerView 不应该像 Apple 一样顺其自然吗?

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

我想我在这里遗漏了一些非常基本的东西,但我不知道它是什么。我在 Interface Builder 或 XCode 中看不到任何与我的和他们的不同的东西,但我现在有狭隘的视野,无法再清楚地看到任何东西。

谢谢,

比尔

【问题讨论】:

    标签: objective-c ios instance-variables


    【解决方案1】:

    这一行的 IBOutlet 修饰符是关键...

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

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

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

    【讨论】:

    • 我敢打赌,听到您找到答案,您不会感到惊讶!连接在 MainWindow.xib 文件中的 UIDatePicker 和 MyTableViewController 类之间,所以当我在 MyTableViewController nib 文件中四处寻找时......什么都看不到! Apple 是否有任何理由选择将 UIDatePicker 放入 MainWindow nib 文件而不是 MyTableViewController nib 文件?这似乎有点“脱节”,但这里可能有一种我不知道的合理设计模式在起作用。 (而且,作为 n00b,这很有可能。)再次感谢,马特!
    • 我快速浏览了示例,您对 MainWindow.xib 的奇怪用法完全正确。就我个人而言,我会在 MyTableViewController 笔尖中设置连接——感觉就像是正确的范围。将其推送到 MainWindow 的唯一原因是设置与应用程序级别对象之一 UIApplication 或其委托的连接,本示例未执行此操作。很高兴你被排序了:)
    【解决方案2】:

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

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

    【讨论】:

    • 感谢这些链接——我仍在熟悉文档并且一直在寻找 Apple 提供的此类信息。我读过有关该主题的其他书籍,但它们都是以身作则,不一定能解释 Apple 在工具集和设计背后的思考过程。
    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多