作为一个相当新的Objective-C编程器(带4年Java的经验),我似乎有一个很难理解时使用类扩展。 从我的理解(和请纠正我,如果我错了),类别和扩展之间的主要区别在于,扩展期望您实现您的主要执行里面的方法,而用一个类别,它可以在另一个实施。 这也似乎人们正在使用的扩展主要是针对私有方法。
这是我的第一个问题。 什么是使用类扩展声明的私有方法,而不是宣布它在所有的区别(这似乎在运行编译在这两种情况下)? (实施例1比2)
实施例1
@interface Class()
-(void) bar;
@end
@implementation Class
-(void) foo {
[self bar];
}
-(void) bar {
NSLog(@"bar");
}
@end
实施例2
@implementation Class
-(void) foo {
[self bar];
}
-(void) bar {
NSLog(@"bar");
}
@end
第二个问题:什么是宣布延长内部实例变量,直接宣告它实现内部之间的区别? (3为例对4)
实施例3
@interface Class() {
NSArray *mySortedArray;
}
@end
@implementation Class
@end
实施例4
@implementation Class
NSArray *mySortedArray;
@end
我对编码约定的最后一个问题:我何时应该在变量名前加上下划线(_)?
谢谢
在课堂上的扩展方法
它从来没有使用过是你并不需要声明私有方法的情况。 直到最近,你需要的地方声明私有方法,大多数人选择了类扩展这样做。 在Xcode 4.4(我相信),编译器是足够聪明,以确定哪些方法意到执行中是私有的,不再需要到别处申报。
在课堂上扩展变量
作为用于实施例3和4,要小心。 内一类扩展,该变量是一个实例变量的那类(实施例3)。 实施例4声明一个全局变量(由于它遵循全局变量语义选自C的事实)。 实施例3在您的私有实例变量棒。
编码约定
至于编码规范,它是由开发者/团队来决定是否使用下划线或不。 我们的团队使用m_
私人实例变量。 苹果公司在其文档建议使用下划线(这对底层的实例变量综合性的命名风格)。 重要的是, 要在你的代码是一致的。
类别和扩展之间的主要区别在于,扩展期望您实现您的主要执行里面的方法,而用一个类别,它可以在另一种实现方式。 这也似乎人们正在使用的扩展主要是针对私有方法。
正确。
什么是使用类扩展声明的私有方法,而不是宣布它在所有的区别(这似乎在运行编译在这两种情况下)?
也许只是关于未申报的选择编译器警告。 (当然它运行良好 - 实施该方法并确实存在。)另外请注意,一个声明(已知的,正确的函数签名)是必要的编译器,以便为发射ABI符合的,正确的二进制代码。 这使得关于未申报方法的假设(即他们返回id
并接受可变参数)可能不正确-调用一个函数通过不兼容的类型的指针是未定义的行为。
什么是宣布延长内部实例变量,直接宣告它实现内部之间的区别?
在第四例子,这是一个全局C变量,它不是你的类的实例变量。
当我应该把下划线(_)在一个变量名称前面?
每当你想,只是做它始终。 总是或从不。
在问题1,实施例2:方法foo和bar中类中实现是类的实例可见。 如果foo和bar没有在一个单独的头文件中声明和实现文件没有提供,其他类将不知道foo和酒吧的存在。 foo和酒吧私有方法; Class的实例仍然会响应foo和栏消息。 此外,Xcode的将标记警告如果试图消息foo和bar因为Xcode是无法验证(没有在头文件的声明),该foo和bar存在另一个类。 相反,杆的实施例1声明允许任何其他类消息栏发送到类的实例。 Xcode同样将吧不标志任何消息的错误,如果@interface类是在由其他类#IMPORT的头文件。
问题2,实施例4:mySortedArray与类内的局部范围中声明的局部不可改变阵列。 实施例3中的mySortedArray是创建该类的一个实例类型的NSArray访问其他类的一个实例变量。
在类扩展和Categores优秀的解释,
http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html