【问题标题】:Basic Objective-C: Why does this code work?基本 Objective-C:为什么这段代码有效?
【发布时间】:2009-07-27 04:32:12
【问题描述】:

问题1)

我有一个基于导航的应用程序,单击一个条目会打开第二个视图,其中包含该条目的详细信息。

现在可以使用以下代码

[self.navigationController pushViewController:descriptionController animated:YES];
[self.descriptionController.textView setText:[s description]];  
self.descriptionController.title = [s name];

但是,如果我切换第一个和第三个语句,那么当我第一次单击一个项目时,详细信息视图会显示 Lorem Ipsum 文本。第一次之后,它按预期工作。我认为这样做会更正确。为什么它会在第一个视图中显示 Lorem Ipsum,但之后不会显示任何内容?

问题 2)

此外,我的 textView 元素是详细信息视图的一部分。在我的视图控制器类中:

@property( nonatomic, retain) IBOutlet UITextView *textView;

但是如果我把它改成

@property( nonatomic, copy) IBOutlet UITextView *textView;

然后它崩溃了。我不认为它会崩溃,但我认为它只是创建新实例,只是白白占用内存。谁能解释一下?

【问题讨论】:

  • @Pax:你可以随时自己编辑。我尽了最大努力,但我对 Objective-C 几乎一无所知。如果您能找到更好的标题,请提供。

标签: iphone objective-c cocoa-touch uiviewcontroller


【解决方案1】:

问题是 -[UIViewController view] 及其所有子视图都是从您的 NIB 或以编程方式在 loadView 中延迟填充的。所以:

//At this point descriptionController.view == nil && textView == nil
[self.navigationController pushViewController:descriptionController animated:YES];
//At this point descriptionController.view and textView are set

[self.descriptionController.textView setText:[s description]];  
self.descriptionController.title = [s name];

因此,如果您推送交换,则推送(加载视图)在其他行之后“

[self.descriptionController.textView setText:[s description]];  
self.descriptionController.title = [s name];

//At this point descriptionController.view == nil && textView == nil
[self.navigationController pushViewController:descriptionController animated:YES];
//At this point descriptionController.view and textView are set

您将 set 消息发送到 nil 值(什么都不做),然后使用其默认值加载视图。

【讨论】:

  • 我仍然不明白为什么它们首先是 nil,因为我已经实例化了视图。所以我只是在修改内存中对 GUI 不可见的对象。
  • 您已经实例化了视图 controller,但视图和子视图在实际显示之前不会创建(即推送到导航控制器上)。
【解决方案2】:

在我的视图控制器类中:

@property( nonatomic, retain) IBOutlet UITextView *textView;

但是如果我把它改成

@property( nonatomic, copy) IBOutlet UITextView *textView;

然后它崩溃了。

因为 UITextView 不符合 NSCopying。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2014-02-02
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多