我即将重构当前的iOS项目以使用ARC。在使用“Refactor to ARC”工具i xCode预览更改以将当前代码迁移到ARC之后,我可以看到我当前的代码约定可能不适合ARC。因为它为我的ivars添加了很多__weak / __strong等。
以下是我目前的惯例:
我将所有实例变量定义为私有或受保护的ivars。和我创建@property的所有公共变量。
@interface TestClass
{
@private
NSMutableArray* mArray;
NSString* mString;
BOOL mMyBoolean;
}
@property (retain, nonatomic) NSString* string; // public
@end
所有对象我总是用@property回来,以避免处理release / retain所以如果我有一个私有变量作为引用,我只是在实现中创建一个类别。结构(如mMyBoolean)我只是将define留作ivar。
@interface TestClass()
@property (retain, nonatomic) NSmutableArray* mArray;
@end
@implementation TestClass
@synthesize string = mString;
@synthesize mArray;
@end;
但是因为新ARC正在处理保留/释放,所以我不需要@property支持私有变量。
那么哪些代码约定更合适?我一直在考虑在界面中定义属性,如下所示:
@interface TestClass
{
@private
NSMutableArray* mArray;
BOOL myBoolean;
}
@property (strong, nonatomic) NSString* string;
@end
@implementation TestClass
@synthesize string;
@end
并且不要为私有属性使用类别属性。 (我也删除了“m”前缀)我没有定义@property应该使用的支持的ivar,而我只是让xcode使用它自动生成?。
答案 0 :(得分:1)
这更像是一个风格问题,所以...客观地回答很难,但我会投入两分钱。就我所见,你所做的事情没有任何问题。如果你的目标是看看你能做些什么来获得更清洁的代码,那么我将分享我的命名惯例(虽然一个人的垃圾是另一个男人的宝贝,所以如果你不喜欢它那么......很难哈哈,你不要不得不采取任何措施。)
1)iVars以m开头,永远不会公开。
2)属性合成为以下划线(_)开头的变量名,没有明确的后备变量,除非我需要继承类才能在内部修改只读变量,在这种情况下我需要将其移动到公共接口(我仍然用下划线命名它,以表明它是一个属性变量)。属性是通过接口公开一些信息,但由于实现可以访问它没有意义的一切,我从不在私有接口中使用属性,除了以下情况:
3)延迟加载的属性,或者除了简单地赋值给变量之外的逻辑。在这种情况下,如果我只覆盖getter或setter(不是两者),我仍然会合成到(_)并覆盖所需的方法(不需要显式变量)。如果我覆盖两者,我不合成然后显然我需要一个明确的支持变量(不要忘记调用KVO方法^^)。
没有“正确”的方法来做我想象的那种东西......唯一似乎是普遍的指导方针
1)以和您的团队可以轻松理解的方式进行操作
2)始终如一地
3)对于API,只需查看头文件即可轻松理解。