【问题标题】:Terminology question re Objective-C / iOS关于 Objective-C / iOS 的术语问题
【发布时间】:2011-01-05 13:10:52
【问题描述】:

对不起,如果这听起来有点像一个菜鸟问题,我对 ObjC 和 iOS 还比较陌生,但对软件开发并不陌生,但是,在阅读有关各种主题的文档/观看视频时,我听到某些短语我'不确定,是否有人可以花点时间对以下术语进行非常简短的描述 - 或者,为我指出一个很好的参考。

我将在下面列出我坚持使用的术语以及我认为我认为它是/意味着什么,以及任何帮助纠正我以便我可以更好地遵循 Apple 文档流程的帮助将不胜感激。

1) 单例

可能类似于 PHP 中的完全静态类,没有实例方法

2) 模型、视图、控制器 (MVC) 组织 - 特别是“模型”组件

我知道广义的定义是将事物分开,我认为这等同于您的视图将是您构建以通过编程方式或在界面构建器中输出到屏幕的内容,控制器将是处理消息的代码(点击, taps 等) 从视图中将信息推送到视图中,尽管在许多情况下形成视图和控制器的 .xib 和 .h/.m 对属于同一家族(即 MyViewController.h/.m/.xib )。我猜测的模型是用于从源读取和写入数据的单独处理程序,例如,您向其发送消息的类,可以从 SQLite 数据库或 XML 提要加载和返回数据并处理它。

3) 在谈论对象类型时,* 的正确位置在哪里?

我知道 * 表示指针,但我看到过类似下面这样写的东西,看起来它们的意思是一样的:

NSString *myVar;
NSString* myVar;
NSString * myVar;

我知道 * 跟在消息头中的类型之后,例如:

- (void)myMessageHandler:(NSString *)str;

4) 什么时候使用 NSInteger 而不是普通的 int?

这可能会让我看起来像个白痴,但我不得不问它,因为我不确定何时使用哪个,而且我看到了许多不同的例子。

5) 可重用的实体标识符

当出队/创建通过重用队列工作的对象时,我看到每次都使用相同的标识符(例如,对于 UITableViewCell,@"cellIdentifier")。但是,我看到的是每次都使用相关的行数据重置单元格,而不是简单地存储在队列中,这种混淆来自 HTML 中的表格,在哪里寻址每一行,您要么遍历 DOM,要么添加一个 ID 标签每一行都是唯一的。

我认为这是一个内存管理问题,如果您使用默认类,您不会真正注意到发生了什么,但如果您使用不同的自定义类,我认为您的想法是您只实例化每种类型中的一个每个父类实例(例如 UITableView),这样即使您每次都重置属性,所需的总内存也是最小的,并且实例化时间从循环中取出,因为您只执行一次?

这个问题的第 2 部分是,如果我的应用程序有多个视图控制器相互推送,是否建议使用与特定视图相关的唯一标识符,所以如果我使用自定义子类,标识符不会导致重叠,也不会导致内存泄漏。

例如,如果我在两个 UITableView 中使用“cellIdenfier”作为我的可重用身份名称,但第二个使用 UITableViewCell 的自定义类,当我返回时,UITableView 会推送一个地图,该地图会在选择注释时推送 UITableView顶视图,系统在出队期间不会潜在地返回错误的类型并导致稍微奇怪的输出吗?

【问题讨论】:

  • 你真的应该一次只发布一个问题,因为它违背了 Stack Overflow 作为资源的精神。 :-)
  • 抱歉,我以为我会用 5 个同时发布的帖子弄乱系统,但我认为您的观点是,将它们组合在一起可能不会吸引具有所需技能的用户来完全回答问题。以后我会记得做单独的帖子。
  • 回答问题 3,其中任何一个都可以。我更喜欢它在名称旁边的右侧,因为我将它作为指针的事实更多地与它的名称而不是它的类型相关联。
  • 谢谢 Matthew,我想我会坚持下去,现在我知道这并不重要,它使阅读整个网络的示例代码更容易理解。跨度>
  • 那里甚至不需要空间! NSString*foo; 可以正常工作。

标签: objective-c model-view-controller ios4 terminology


【解决方案1】:

即使你已经接受了一个答案,由于它不完整,我会补充它。

就我而言,Karl 的单身定义很重要。

模型不仅仅是存储数据的对象,它也是业务逻辑。

至于 * 的位置,是的,这是一个风格问题,但说它是 C 中类型的一部分(Objective-C 是其中的超集)是不正确的。这很容易通过以下方式证明:

int* foo, bar;

它没有声明两个 int* 类型的变量,而是一个指向 int (foo) 和一个 int (bar) 的指针。所以技术上你应该把*和变量名放在一起。但是,我使用与 Karl 相同的约定,并通过从不在逗号分隔的列表中声明变量来避免上述问题。

什么时候使用 NSInteger 而不是普通的 int?

您应该始终在 Cocoa API 文档要求的任何时候使用它。与普通的 int 相比,使用它绝对没有任何优势。如果您需要保证 int 类型的特定宽度,您应该使用来自 stdint.h 的 C99 标准宽度(int32_t、int64_t 等)。如果您不需要保证一定的宽度,您不妨使用内置类型,除非 Cocoa API 为您提供 NS(U)Integer。将 NS(U)Integer 转换为(无符号)int 会在某些架构(例如 x86_64)上存在截断它的风险。

可重用的实体标识符

对于当前在屏幕上可见的每个单元格,UITableView 需要一个实例。实例化一个单元格可能会很昂贵(例如,您可能需要去磁盘加载一个 NIB),所以当单元格离开视野时,表视图不会将它们丢弃,而是将它们放入丢弃的单元格队列中。当您需要一个新单元时,从队列中拉出一个未使用的单元比从头开始实例化一个单元要快得多。

需要重用标识符,因为您的表格视图中可能包含不同类型的单元格。例如一行可能有一个文本字段,另一行可能有一个日期选择器。因此,如果表格视图为文本行请求一个单元格,那么给它一个带有日期选择器的单元格是不好的。

【讨论】:

  • 太棒了,所以,为了确保我理解,NSInteger 与 int,如果实例方法、委托协议等指定 NSInteger,则使用它,否则,我的选择。对于标识符,如果表格中的所有单元格都相同,则使用相同的标识符即可,如果它们用于不同类型的数据或视图,则使用不同的。如果我是对的,那是完美的感觉。
【解决方案2】:

正如 middaparka 所说,您可能应该拆分问题,但我可以回答 1-3。

单例是一种设计模式,意味着整个程序中只有一个类的实例。它通常使用静态getInstance 方法实现,该方法要么返回现有实例(存储为静态变量),要么在不存在时创建一个新实例。任何关于设计模式的好的参考都应该解决它。

对于 MVC,您对模型的想法基本上是正确的。模型是存储数据的地方。同样,请查看设计模式参考以了解详细信息。

至于 * 去哪里,这主要是风格问题,因为编译器会接受任何方法。我个人更喜欢把它放在类型旁边,因为它在技术上是类型的一部分,但我工作过的大多数地方都把它放在标识符旁边。我相信将它放在标识符旁边的理由是 * 的其他用途之一是取消引用指针,在这种情况下,将它与变量分组是有意义的,并且他们希望使其在视觉上保持一致。当用作乘法运算符时,我只看到 * 周围的空格。

【讨论】:

  • 谢谢你,卡尔,这清除了一些泥巴,我会听取你的建议,稍后将 4 和 5 作为单独的问题重新发布,并将搜索 mvc 设计模式以进一步阅读。我现在也完全理解拆分问题的必要性,因为其他寻找答案的读者可能会发现很难遵循这个链条。我的朋友们很好地吸取了教训。
  • @JamesB:当你重新发布这些部分时,别忘了在这里删除它们,这样人们以后可以很容易地找到有用答案的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多