在Cocoa中,将私有API放在.m文件中,将公共API放在.h文件中,这是一种好的做法吗?
我当前项目中的许多类都有几个属性和方法,这些属性和方法只能从类本身中调用。此外,根据类的当前状态,它们可能会干扰类的工作。在Cocoa中,将私有API放在.m文件中,将公共API放在.h文件中,这是一种好的做法吗?,cocoa,interface,implementation,private,Cocoa,Interface,Implementation,Private,我当前项目中的许多类都有几个属性和方法,这些属性和方法只能从类本身中调用。此外,根据类的当前状态,它们可能会干扰类的工作。 目前,所有这些接口都在.h文件的主接口声明中定义。将“private”方法和属性放在.m文件的顶部是否被认为是良好的做法 这不会影响任何事情,因为我很可能是唯一一个看过这段源代码的人,但当然,了解未来的项目会很有趣。是的,将它们放在.m文件顶部的一个类别中。从Objective-C2.0开始,最好的做法是将私有方法放在“类扩展”中。这允许编译器在您尚未实现其中一个方法时发出
目前,所有这些接口都在.h文件的主接口声明中定义。将“private”方法和属性放在.m文件的顶部是否被认为是良好的做法
这不会影响任何事情,因为我很可能是唯一一个看过这段源代码的人,但当然,了解未来的项目会很有趣。是的,将它们放在.m文件顶部的一个类别中。从Objective-C2.0开始,最好的做法是将私有方法放在“类扩展”中。这允许编译器在您尚未实现其中一个方法时发出警告。类扩展还允许您修改@properties的读/写语义,以便公共API可以(例如)为属性指定
readonly
,而在内部该属性可以用作readwrite
在h中:
@interface MyClass : NSObject
{}
@property (readonly) id myProp;
- (void)aPublicMethod;
@end
In.m:
@interface MyClass ()
@property (readwrite) id myProp; //upgrade myProp to readwrite within the class.
- (id)aPrivateMethod;
@end
@implementation MyClass
@synthesize myProp;
- (void)aPublicMethod { ... }
- (id)aPrivateMethod;
@end
如果忘记在主
@implementation
块中实现-aPrivateMethod
,编译器将发出警告。这比使用类的旧方法要好,例如@interface MyClass(PrivateMethods)
,在这种情况下,编译器不会警告您该方法没有实现。如果您使用的是Objective-C 2.0,请在.m文件中使用类扩展名,而不是类扩展名。类扩展名是最好的选择。IIRC扩展方法必须在主@implementation块中定义。如果使用命名类别,则它可以放在主@implementation块中,也可以放在同一个或不同的.m文件中的单独块中。@Abizem完全正确。这就是为什么如果您忘记在命名类别中实现方法,编译器不会/不能警告您;实现可以在任何地方,甚至可以在运行时添加。