NSObject和UIViewController有什么区别?

8

我是新手iPhone开发者,正在学习教程和一些示例。

我想知道NSObject类和UIViewController类之间的区别,以及我们如何知道应该使用哪个类。

有些写在NSObject中,有些写在UIViewController中。


1
你能给出一些让你困惑应该使用哪个的例子吗?它们之间有很大的区别。 首先,UIViewController实际上是NSObject的一个子类。 - jscs
4个回答

14

维基百科提供了面向对象编程的基本概述:

面向对象编程(OOP)是一种编程范式,使用“对象”——数据结构和方法以及它们之间的交互来设计应用程序和计算机程序。[...] 面向对象程序通常包含不同类型的对象,每种类型对应于要管理的特定复杂数据或实际世界对象或概念,例如银行账户、曲棍球运动员或推土机。

在Objective-C中,所有对象都基于NSObject。现在先接受这个事实。如果您想使用一个对象,它将基于NSObject。因此,除非您使用intfloat,否则您可能正在使用基于NSObject的东西。

NSObject本身并没有提供任何功能。它是您创建对象的“起点”或“空白状态”。

您可以构建一个对象定义,用于表示动物,如下所示:

@interface Animal : NSObject { }

@property (assign) int age;

- (Animal*)mateWith:(Animal*)lover;

@end

在这个例子中,我们描述了一个基本的Animal。这个类主要有两个作用:知道Animal的年龄,以及可以与另一个动物交配生产出一个Animal后代。
你会注意到,在这个例子中,我们基于NSObject来定义了我们的对象。
现在,假设我们想为人类创建一个定义;好吧,人类是所有动物的子集,且始终如一。因此,我们可以重复使用Animal类定义中的所有逻辑来创建一个人类定义 - 我们可能会这样做:
@interface Human : Animal { }

- (void)lie;

@end

在这个例子中,我们创建了一个名为“Human”的对象类型的新定义。我们只定义了一件事:一种使我们的类具有说谎能力的方法 - 除此之外,我们还将获得交配的能力,因为我们基于“Animal”,而“Animal”已经描述了如何交配。
回到你的问题:
UIViewController包含大量用于执行一些非常复杂任务的逻辑。其中大部分逻辑是Cocoa Touch框架的一部分。
如果你正在创建一个“Animal”类,你不需要知道如何响应屏幕上的用户输入,也不需要知道如何管理UIView,也不需要跟踪parentViewControllers等等。因此,基于UIViewController创建我们的Animal类是愚蠢的。这就是不使用UIViewController的情况。
现在,如果你正在iPhone上创建一个用户界面屏幕,并且想要在用户单击按钮时执行一些例行程序 - 那么你确实需要所有的UIViewController内容,所以你会对其进行子类化。
我可以理解,如果你没有从面向对象编程背景出发,你可能会感到困惑。似乎你需要创建的大多数东西都是UIViewController的子类。然而,当你探索面向对象编程的世界时,你会发现对象不仅仅是别人编写并可供使用的东西 - 它们也是你想从头开始创建的东西,以完成你以前按程序执行的任务。
祝你旅途愉快。
我强烈建议您前往当地的Barnes and Noble书店或访问Amazon.com购买一些与该主题相关的书籍。如果您有一个已经了解面向对象编程(OOP)的朋友,那么一个好的导师比自学要快得多。
不要忘记,在iPhone上,您还需要处理内存管理。这是许多人的难点 - 如果您不遵循规则,将会带来很多麻烦。早学习它们会对您有所帮助。
希望这可以帮到您,祝福您。
来源:

非常感谢,这帮助了我并让我理解了这些事情...请推荐一个好的链接,在那里我可以找到免费的在线书籍,它们是以PDF格式提供的,我可以从头开始下载并学习有关Objective-C等内容。 - Abhilash
好的;http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf 是苹果公司有关 Objective-C 的 PDF 文件,内容非常详细。此外,这里有一个有趣的面向对象编程概述链接:http://www.codeproject.com/KB/architecture/OOP_Concepts_and_manymore.aspx(使用 C# 语言,但概念相同,除了内存管理)。当然,可以通过谷歌搜索“引入面向对象编程”来查找更多资料:http://www.google.com/search?q=introduction+to+object+oriented+programming&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a - Steve
@Steve...我收到了你发来的关于苹果公司Objective-C的PDF文件,但我想要一些新手入门级别的Objective-C相关的PDF文件,除了你之前发送给我的那份之外,还有一些电子书。 - Abhilash

6

UIViewControllerUIResponder的子类,而UIResponder本身是NSObject的子类,而NSObject是一个根类(即不是任何子类)。

这意味着可以在UIViewController上调用NSObject的任何方法,但反之则不行。如果查看UIViewController Class Reference,它列出了您可以使用此类的所有属性和方法。此外,您还会自动获得NSObject的所有方法(列在NSObject Class Reference中)。

我为每个视图维护使用UIViewController。我几乎从不直接使用对象作为NSObject,尽管我经常子类化NSObject,但我从不子类化UIViewController。但这只是我的做法。

我建议您查看苹果的View Controller Programming Guide,以了解使用UIViewController的好处。


谢谢。NSObject是根类。我们如何决定使用哪个类? - Abhilash
@Abhilash:这取决于你想做什么。如果你想使用特定于UIViewController的方法,例如view属性,则使用它。如果你只想使用NSObject固有的方法,则使用它。我几乎从不直接使用NSObject,但我经常对其进行子类化。 - PengOne

3

NSObject表示它仅继承ObjectProperties。它没有视图。但是,UIViewcontroller自身具有视图。它可以控制视图。

当您不需要视图时,可以使用NSObject。如果需要视图控制器或视图,则可以使用UIViewController。


2

NSObject是Objective-C中的超类,而UIViewcontroller是NSObject的子类。UIViewcontroller继承自UIResponder,并从NSObject类继承属性...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接