我有几个关于objective-c的问题,你能帮我理解一下吗?他们在这里:
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”模拟器成为默认情况下模拟器?
就是这样。 :)感谢您的帮助
保
答案 0 :(得分:1)
委托设计模式是一种方式 无需修改复杂对象 继承它们。代替 子类化,你使用复杂 对象按原样放置任何自定义代码 用于修改其行为 对象里面有一个单独的对象 被称为委托对象。 在预定义的时间,复杂 对象然后调用的方法 委托对象给它机会 运行自定义代码。
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,你永远不应该这样做。或者你需要在相同的行中自动释放它,这也是令人困惑的。
所以摘要是如果你有保留属性,那么写三行代码来处理双重所有权。
抱歉,对其他部分无法帮助。