Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.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关键字';不能合成?_Ios_Properties_Xcode4.2_Automatic Ref Counting - Fatal编程技术网

Ios 我不需要的属性是否需要ARC关键字';不能合成?

Ios 我不需要的属性是否需要ARC关键字';不能合成?,ios,properties,xcode4.2,automatic-ref-counting,Ios,Properties,Xcode4.2,Automatic Ref Counting,我有一个属性,我不合成它,而是自己创建一个getter和setter。因此,我认为ARC关键字(强或弱)没有任何意义,所以我将其删除。这在Xcode 4.3上运行得很好,但是当我的同事在Xcode 4.2上打开它们时,编译器抱怨没有强/弱关键字,所以我指示他毫无意义地再次输入关键字。哪个是正确的(有或没有关键字) 需要明确的是:我有这样一个属性@property(非原子)NSString*foo,在.m文件中我实现了-(NSString*)foo和-(void)setFoo:(NSString*

我有一个属性,我不合成它,而是自己创建一个getter和setter。因此,我认为ARC关键字(强或弱)没有任何意义,所以我将其删除。这在Xcode 4.3上运行得很好,但是当我的同事在Xcode 4.2上打开它们时,编译器抱怨没有强/弱关键字,所以我指示他毫无意义地再次输入关键字。哪个是正确的(有或没有关键字)

需要明确的是:我有这样一个属性
@property(非原子)NSString*foo
,在.m文件中我实现了
-(NSString*)foo
-(void)setFoo:(NSString*)foo
,并且不包括
@synthetic foo
。另一个相关细节是没有相应的iVar,而是属性与核心数据对象交互。除非我在关键字中添加强项或弱项,否则不会在XCode 4.2中编译

编辑我想到了另一件相关的事情,其中一个属性在协议上,我不知道这是否有区别。

borrden

首先,为什么要在属性语句中省略内存策略?它会向你们班的消费者宣布该政策是什么。你不想让他们知道吗

其次,@synthesis不是nop。这是语言支持KVO的机制。虽然您现在可能没有使用它,但您为什么要在将来排除使用它呢

坦白地说,在@property中没有使用完整的描述,也没有使用@synthesis,在我看来,您正在进行过早的优化。您当前的设计不会为您保存消息分派,并强制您在必要时管理IVAR的创建和键入。你正在失去这种语言的特征

除非您有充分的理由超出首选Obj-C v2+模式的范围,并且您还没有列出这些模式,否则我将返回使用标准模式。然后你的问题就消失了


Andrew

您正在引用的声明属性是可选的。要引用文档,请执行以下操作:

属性声明和实现
@property指令声明一个属性。可选括号 属性集提供了有关存储的其他详细信息 属性的语义和其他行为-有关可能的值,请参阅“属性声明属性”

属性声明属性
你可以用它来装饰房子 属性(attribute[,attribute2,…])。 与方法一样,属性的作用域也限定在其封闭接口上 宣言。对于使用逗号分隔列表的属性声明 对于变量名,属性属性应用于所有已命名的 财产

如果使用
@synthesis
指令通知编译器创建 访问器方法(请参阅“属性实现指令”) 它生成的代码与关键字给出的规范匹配。如果 如果您自己实现了访问器方法,则应该确保 与规范匹配(例如,如果指定“复制”,则必须 确保在setter方法中复制输入值)

如果您随后使用
@dynamic
而不是
@synthetic
,它会告诉编译器您将编写自己的方法,并防止编译器在找不到合适的方法时抱怨


可以找到更多信息。

通常有很好的理由编写自己的方法。(如计算属性、验证等)
@synthesis
与KVO完全无关。您可以使用KVO,而无需编写
@synthesis
,同时提供自己的自定义setter和getter。这不是优化,而是逻辑。这些属性没有IVAR。这些属性通过依次设置其属性与核心数据对象交互。在这种情况下,你认为他们是强者还是弱者?可能与我正在设置的后续对象属性相同。只要我不引起任何副作用,我不介意写下来。核心数据IVAR都很强大。只有当我有特定的理由这样做时,我才会使用
weak
。我把这种设置称为保留。如果我可能需要一些东西,那么我会保留它。如果它导致一个保留周期,我会使它
。我认为这是一个工程问题,而不是逻辑问题。工程部分是关于代码维护。Obj-C是一个主要自我记录的环境。不要通过删除属性标记来削弱它。顺便说一句,我认为默认的@property内存策略是
strong
。省略它不会改变编译器的行为。瞧,你已经使代码不透明了——为了什么目的?很有趣……我将尝试添加一个动态代码,看看它在XCode 4.2上是否有效