关于obj-c(delegate,viewController,simulator)的几个问题

时间:2011-06-29 12:44:01

标签: iphone objective-c delegates ios-simulator viewcontroller

我有几个关于objective-c的问题,你能帮我理解一下吗?他们在这里:

  1. 为什么我们有时使用:
    self.myView.delegate = self; ?
  2. Ipad和Splitview也有同样的事情:为什么我们这样明确地使用委托:

      

    uisplitviewController * svc = ...
      svc.delegate = pvc.otherViewController;

    目前,我理解“appDelegate”,但这种委托方法呢?

    2.我多次使用另一个“viewController”,而不是直接“分配”“mainViewControler”,为什么我们使用这个中间体?

      

    MainViewController * viewController = [[MainViewController alloc] initWithNibName:@“MainView”bundle:nil];
          self.mainViewController = viewController;
          [viewController release];

    3.以下来自appsmuck.com的一些教程,我看到他们使用:

      

    “(void)loadFlipsideViewController”

    但没有“loadView”,那么,我们可以用控制器视图替换“View”吗?

    4.最后,我可以从“iphone”模拟器切换到“ipad”模拟器,但每次我构建projet时我总是得到ipad模拟器,有没有办法让“iphone”模拟器成为默认情况下模拟器?

    就是这样。 :)感谢您的帮助

3 个答案:

答案 0 :(得分:1)

1。 Delegation Design Pattern

  

委托设计模式是一种方式   无需修改复杂对象   继承它们。代替   子类化,你使用复杂   对象按原样放置任何自定义代码   用于修改其行为   对象里面有一个单独的对象   被称为委托对象。   在预定义的时间,复杂   对象然后调用的方法   委托对象给它机会   运行自定义代码。

2。创建另一个viewController的原因是内存管理。它可以在一行中完成,但之后您将不必要地将对象添加到自动释放池中。

//Now the autorelease pool has to track this object
self.mainViewController =  [[[MainViewController alloc] initWithNibName:@"MainView" bundle:nil] autorelease];

3。 -(void)loadView继承自UIViewController,因此您不能将其更改为loadViewController,因为这只会创建自定义方法。这正是(void)loadFlipsideViewController试图完成的事情,它的名称应该加载一个新的视图控制器并使用翻转动画显示它。

4。在XCode 4中,您需要将方案设置为正确的模拟器。

答案 1 :(得分:1)

首先,如果您将所有这些查询分解为单独的问题,那么我将更容易获得答案。你将很难选择一个能够最好地回答这些问题的答案。

那就是说,我会给#1一个镜头。

Cocoa(和Cocoa Touch)中的许多类型的对象都会发送消息。有些像NSFetchedResultsController在内容发生变化时发送消息。有些像UITableViewController,在触摸表格单元格时会发送消息。这些消息必须转到某个地方。它们不能只是“在那里”发送,或者什么都不会听到它们。这些消息需要一个目的地。在Cocoa中,这些消息的目的地称为“委托”。如同,“我将此对象指定为我的代表,并接收我的消息。”

如果你在一个控制UITableView的viewController中,通常只需指定“self”作为委托即可。这就是说,实际上,嘿,UITableView先生,只是把你的消息发给我,我会处理它们。反过来,你的viewController必须声明(在.h中)它们符合UITableViewDelegate协议,然后必须在你的.m中实现该协议中所需的方法。

这是Cocoa中非常常见的模式。在你理解之前不要继续。

答案 2 :(得分:0)

对于代表,您可以查看use of Delegate in iphone sdk。我的回答很长there

@property (nonatomic, retain) MyClass *obj;

MyClass *tmpObj = [[MyClass alloc] init];
self.obj = tmpObj;
[tmpObj release];

让我们看看这里发生了什么。 [MyClass alloc]分配一个对象并保留计数为1.在下一行中,您将调用也保留的setter。所以你增加了保留计数。当然,您稍后会发布此属性,可能位于dealloc。所以现在你是这个对象的拥有者2次。要通过alloc匹配第一个所有权,请在第3行中发布。

现在看看如果你在一行中这样做会发生什么:

self.obj = [[MyClass alloc] init];

您在这里获得了两次所有权,一次通过alloc获得,一位通过retain属性获得。所以你需要写两次[obj release]。否则你会有内存泄漏。但是发布两次令人困惑并且更容易创建bug,你永远不应该这样做。或者你需要在相同的行中自动释放它,这也是令人困惑的。

所以摘要是如果你有保留属性,那么写三行代码来处理双重所有权。

抱歉,对其他部分无法帮助。