我在.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)的样式指南,历史原因或规则?或者是什么时候声明和不声明私有方法的“规则”?
答案 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;
然后编译器可以告知您歧义。