2013-07-18 21 views
1

我正在学习objective-C,我知道我们可以使用扩展将一些私有成员添加到接口。为什么在扩展中有一个私有的?

但书上说,应该没有在()

我读了下面的代码片段

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

我很奇怪,为什么有民办的里面()

+0

http://stackoverflow.com/questions/4685679/minutia-on-objective-c-categories-and-extensions –

回答

2

你可以把类别声明中的任何名称,通常表明该类别的用途。

所以在代码中你的情况下,笔者想告诉大家,这些方法是供内部使用的类本身,而不是intented从其他类

0

在这种情况下被认为是一类叫做,但是因为它在.m文件中,所以它会有相同的效果。您还可以看到提示在Xcode:

enter image description here

身为一个考虑中期像Tree(description),最后一个Tree()

0

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

更多细节可以在苹果的dev的网站上找到:

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

1

在您的示例中的声明正是称为类别(不是扩展)。

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

每个类别都有一个名称,这是括号内的位。不应该有两个不同的类别为同一个类具有相同的名称。

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

通常,扩展(如在你的书的例子)在该.m文件的顶部声明,和用于声明的方法,实例变量和/或要被内,仅使用的属性文件(通常由单个类组成)。

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

  1. http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
  2. Defining a property in iOS class extension
  3. http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
相关问题