0

我正要重构我当前的 iOS 项目以使用 ARC。在使用“重构到 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返回所有对象,以避免处理释放/保留,所以如果我有一个作为引用的私有变量,我只需在实现中创建一个类别。结构(如 mMyBoolean)我只是将定义保留为 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 使用它的自动生成?

4

1 回答 1

1

这更像是一个风格问题,所以......很难客观地回答,但我会投入两分钱。据我所知,你所做的事情没有任何问题。如果你的目标是看看你能做些什么来获得更简洁的代码,那么我将分享我的命名约定(虽然一个人的垃圾是另一个人的宝藏,所以如果你不喜欢它那么......好吧,很难哈哈,你不不必从它拿走任何东西)。

1) iVar 以 m 开头,从不公开。

2) 属性合成为以下划线 (_) 开头的变量名,没有显式支持变量,除非我需要继承的类能够在内部修改只读变量,在这种情况下,我需要将其移动到公共接口(并且我仍然用下划线命名它以向我自己表明它是一个属性变量)。属性旨在通过接口公开一些信息,但由于实现可以访问所有内容,所以它没有意义,我从不在私有接口中使用属性,除非以下情况:

3) 延迟加载的属性,或者具有简单分配给变量之外的逻辑。在这种情况下,如果我只覆盖 getter 或 setter(不是两者),我仍然会综合到 (_) 并覆盖所需的方法(不需要显式变量)。如果我同时覆盖两者,我不会合成,那么显然我需要一个显式的支持变量(不要忘记调用 KVO 方法 ^^)。

我想没有“正确”的方法来做这种事情......唯一似乎普遍的指导方针是

1) 以您和您的团队容易理解的方式进行

2)始终如一地做

3) 对于 API,请以仅查看头文件即可轻松理解的方式进行操作。

于 2012-04-18T07:40:49.513 回答