何时声明类扩展方法

时间:2013-06-26 21:24:46

标签: ios objective-c

我在.m中使用了Class Extensions作为一种拥有“私有”方法和变量的方法。我已经读过,自Xcode 4.4以来,编译器不再需要声明的私有方法。

例如,即使未声明helperMethodC,也会编译:

in .h

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

in .m

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

@implementation MyClass

- (void)publicMethodA
{ 
   //Do Something
}

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

- (void) helperMethodC
{
 // Do something
}

虽然不再需要声明私有方法来编译(helperMethodC),是否还应该声明所有私有方法(即helperMethodC)的样式指南,历史原因或规则?或者是什么时候声明和不声明私有方法的“规则”?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;

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