基本目标-C:为什么这段代码有效?

时间:2009-07-27 04:32:12

标签: iphone objective-c cocoa-touch uiviewcontroller

问题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;

然后它崩溃了。我不认为它会崩溃,但我认为它只是创建新的实例,只是占用内存。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

问题是 - [UIViewController视图]及其所有子视图都是懒惰填充的,可以是来自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

您正在将设置消息发送到nil值(不执行任何操作),然后使用其默认值加载视图。

答案 1 :(得分:5)

  

在我的视图的控制器类中:

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

但如果我将其更改为

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

然后它崩溃了。

因为UITextView不符合NSCopying。