Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于ARC的Objective-C特性_Ios_Automatic Ref Counting - Fatal编程技术网

Ios 基于ARC的Objective-C特性

Ios 基于ARC的Objective-C特性,ios,automatic-ref-counting,Ios,Automatic Ref Counting,我正要重构我当前的iOS项目以使用ARC。在使用“Refactor to ARC”工具i xCode预览了将当前代码迁移到ARC的更改之后,我可以看到我当前的代码约定可能不适合ARC。因为它给我的IVAR增加了很多uuu弱/uuu强等 以下是我目前的惯例: 我将所有实例变量定义为私有或受保护的IVAR。以及我为其创建@属性的所有公共变量 @interface TestClass { @private NSMutableArray* mArray; NSString* mString; B

我正要重构我当前的iOS项目以使用ARC。在使用“Refactor to ARC”工具i xCode预览了将当前代码迁移到ARC的更改之后,我可以看到我当前的代码约定可能不适合ARC。因为它给我的IVAR增加了很多uuu弱/uuu强等

以下是我目前的惯例:

我将所有实例变量定义为私有或受保护的IVAR。以及我为其创建@属性的所有公共变量

@interface TestClass
{
 @private
 NSMutableArray* mArray;
 NSString* mString;
 BOOL mMyBoolean;
}

@property (retain, nonatomic) NSString* string; // public
@end
我总是使用@property返回所有对象,以避免处理release/retain,因此如果我有一个作为引用的私有变量,我只需在实现中创建一个类别。Struct(比如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使用它的自动生成?

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

1) IVAR以m开头,从不公开

2) 属性合成为一个以underbar(\)开头的变量名,没有显式的支持变量,除非我需要继承类才能在内部修改只读变量,在这种情况下,我需要将其移动到公共接口(我仍然使用underbar命名它,以指示它是一个属性变量)。属性意味着通过接口公开一些信息,但由于实现可以访问所有内容,因此没有任何意义,并且除了以下情况外,我从不在私有接口中使用属性:

3) 延迟加载或以其他方式具有逻辑的属性,而不是简单地分配给变量。在这种情况下,如果我只重写getter或setter(而不是两者),我仍然会合成到(_)并重写所需的方法(不需要显式变量)。如果我重写这两种方法,我就不需要合成,显然我需要一个显式的支持变量(别忘了调用KVO方法^^)

我想,没有“正确”的方法来做这类事情……唯一似乎具有普遍性的指导方针是

1) 以你和你的团队都能轻松理解的方式进行

2) 始终如一地做


3) 对于API,只需查看头文件即可轻松理解

+1表示始终如一地做。使用ARC很容易混合和匹配直接IVAR和属性,但可能会有点难看。谢谢!当我写这个问题时,我知道它可能有点抽象,但我认为你在概述公约背后的实际想法方面做得很好。