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

Posted

技术标签:

【中文标题】关于obj-c的几个问题(delegate、viewController、simulator)【英文标题】:several questions about obj-c (delegate, viewController, simulator) 【发布时间】:2011-06-29 12:44:01 【问题描述】:

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

    为什么我们有时会使用 : self.myView.delegate = 自我; ?

Ipad 和 Splitview 也有同样的情况:为什么我们要像这样明确地使用委托:

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

目前,我了解“appDelegate”,但是这个委托方法呢?

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

MainViewController *viewController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; self.mainViewController = viewController; [viewController 发布];

3.按照appsmuck.com的一些教程,我看到他们使用:

"(void)loadFlipsideViewController"

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

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

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

保罗

【问题讨论】:

将它们分解为单独的问题。它会更清洁。以后如果有人碰到这个问题,他会更容易得到他需要的东西。如果你幸运的话,你会发现类似的问题。希望你已经这样做了。 【参考方案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 中,您需要将方案设置为正确的模拟器。

【讨论】:

谢谢,所以对于问题 2:向自动释放池添加越来越多的对象真的很重要吗?对于问题4:你能告诉我怎么做吗?我知道如何使用它们,但我不知道在哪里可以说“总是让我使用 iphone 模拟器” @Paul:虽然会产生开销,但对于大多数应用程序来说并不是什么大问题。【参考方案2】:

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

也就是说,我会给 #1 一个机会。

Cocoa(和 Cocoa Touch)中的许多类型的对象都发送消息。有些,比如 NSFetchedResultsController 在内容改变时发送消息。有些,如 UITableViewController,会在触摸表格单元格时发送消息。这些消息必须到达某个地方。它们不能被发送到“外面”,否则什么都不会听到它们。这些消息需要一个目的地。在 Cocoa 中,这些消息的目的地称为“委托”。如,“我指定此对象为我的委托,并接收我的消息。”

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

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

【讨论】:

【参考方案3】:

对于委托,您可以查看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。在下一行中,您正在调用也保留的设置器。因此,您正在增加保留计数。当然你稍后会释放这个属性,可能在dealloc。所以现在你是这个对象的所有者 2 次。要通过alloc 匹配第一个所有权,请在第 3 行发布。

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

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

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

所以总结是如果你有保留属性,然后写三行代码来处理双重所有权。

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

【讨论】:

实际上,我想我也没有得到任何东西:我们是否必须调用二传手?我的意思是,创建的所有变量或对象都与@property getter/setter 无关,是吗? @Paul,不,它们与某些自动过程无关。只有你声明为属性的东西以及你使用 self 时的东西。 obj = anoObj 不调用 setter 但 self.obj = anoObj 调用 setter。使用合成的setter更容易,否则你需要自己处理所有的内存事情。 谢谢,我的意思是:当我们创建一个对象时,比如这里的viewController,如果我们在实现代码中使用它,我们是否必须创建这个对象的@property 和@synthesize?就像我们在“addSubview”消息中从视图控制器“推送”视图一样。

以上是关于关于obj-c的几个问题(delegate、viewController、simulator)的主要内容,如果未能解决你的问题,请参考以下文章

具有多个客户端的 Obj-C 服务器

关于C#中delegate的用法

“仅显示 Obj-c”标志隐藏 xCode Instruments 上调用树的所有内容

关于js模拟c#的Delegate(委托)实现

Qt 关于跳转页面后当前页面(委托delegate)数据丢失的问题

iOS 关于修饰代理用weak还是assign