Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cocoa中,将私有API放在.m文件中,将公共API放在.h文件中,这是一种好的做法吗?_Cocoa_Interface_Implementation_Private - Fatal编程技术网

在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完全正确。这就是为什么如果您忘记在命名类别中实现方法,编译器不会/不能警告您;实现可以在任何地方,甚至可以在运行时添加。