2

我利用 .m 中的类扩展作为拥有“私有”方法和变量的一种方式。我读过自 Xcode 4.4 以来,编译器不再需要声明的私有方法。

例如,即使没有声明 helperMethodC,它也会编译:

在.h

@interface MyClass : NSObject
-(void)publicMethodA;
@end

@interface MyClass ()
- (void) pseudoPrivateMethodB;
@end

@implementation MyClass

- (void)publicMethodA
{ 
   //Do Something
}

- (void)pseudoPrivateMethodB 
{   
 [self helperMethodC];
}

- (void) helperMethodC
{
 // Do something
}

虽然不再需要声明私有方法才能编译(helperMethodC),但是否有样式指南、历史原因或规则要求仍然声明所有私有方法(即 helperMethodC)?还是关于何时声明和不声明私有方法的“规则”?

4

2 回答 2

2

如果他们帮助你,请声明他们。从文档的角度来看,它们非常有用。编译器还将告诉您是否已指定方法将存在但未实现。没有规则,但添加它们是个好主意。考虑一下如果你必须在 6 个月后回来编辑课程,你会有什么感觉——列出的方法对你有帮助吗?

于 2013-06-26T21:28:52.850 回答
0

虽然不再需要声明私有方法才能编译(helperMethodC),但是否有样式指南、历史原因或规则要求仍然声明所有私有方法(即 helperMethodC)?还是关于何时声明和不声明私有方法的“规则”?

有多种约定,但没有标准。

当/如果您需要支持较旧的工具链(GCC 或较旧版本的 Clang)时,您真的应该拥有它们。

一旦取消了该限制,我认为最好将(冗余的)声明分阶段排除在不需要的地方。高警告级别和 ARC 语义可以在此处为您提供指导。

如果你引入类型:

Something * s = [array objectAtIndex:i];
s.string = @"string";
// rather than: [array objectAtIndex:i].string = @"string";

并为参数/返回类型唯一地命名您的选择器:

// BAD: May be ambiguous.
// Solution: Choose a more descriptive selector name.

// class A
- (void)setX:(int)x;

// class B
- (void)setX:(double)x;

然后编译器可以通知您歧义。

于 2013-06-26T21:51:47.977 回答