1

我正在学习objective-C,我知道我们可以使用扩展来向接口添加一些私有成员。

但是书上说()里面应该什么都没有

我阅读了以下代码片段

@interface Tree(Private)
- (void)blah:(int)num;
@end

我想知道为什么里面有 Private ()

4

4 回答 4

2

您可以在类类别声明中放置任何名称,通常表明该类别的用途。

因此,在您的情况下,代码的作者想要告诉这些方法是用于类本身的内部使用,而不是打算从其他类调用

于 2013-07-18T15:05:11.250 回答
1

您示例中的声明精确地称为类别(而不是扩展名)。

您可以向任何给定的类添加任意数量的类别(即使您无权访问源代码)。类别允许您向类添加新方法,但不能添加新的 ivars 或属性。[1]

每个类别都有一个名称,即括号之间的位。同名的同一个类不应该有两个不同的类别。

当名称为空时,这称为扩展名扩展与类别有一些细微差别:您可以将 ivars 和属性添加到扩展中,并且您只能将它们用于您可以访问其源代码的类。[1]

通常,扩展(如您书中的示例)在.m文件顶部声明,并用于声明仅在该文件中使用的方法、ivars 和/或属性(通常由单个类组成)。

PD:如果您真的想通过类别而不是通过扩展添加新属性,您实际上可以使用关联对象 [2][3] 来实现。

  1. http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
  2. 在 iOS 类扩展中定义属性
  3. http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
于 2013-07-18T15:09:03.137 回答
0

在被视为类别的情况下,但由于它位于 .m 文件中,因此将具有相同的效果。您还可以查看 Xcode 中的提示:

在此处输入图像描述

作为中间的被认为是Tree(description)最后一个Tree ()

于 2013-07-18T15:05:41.563 回答
0

这里有两个密切相关的概念:类类别和类扩展。类类别在括号内包含一个名称,最常用于向现有类添加方法或将方法组织到逻辑组中。类扩展扩展了类的内部实现(即用于定义私有属性、方法等)。

更多细节可以在 Apple 的开发网站上找到:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

于 2013-07-18T15:08:53.723 回答