Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c 目标C:@未执行的属性声明(@合成)_Objective C_Properties - Fatal编程技术网

Objective c 目标C:@未执行的属性声明(@合成)

Objective c 目标C:@未执行的属性声明(@合成),objective-c,properties,Objective C,Properties,据我所知,@property在.h文件中声明getter和setter,@synthesis在.m文件中实现getter和setter。此外,还可以为getter和setter编写自己的实现,而不是使用@synthesis 那么,如果我们总是需要实现setter/getter,为什么还要额外声明它呢@属性在语义上对我来说似乎是多余的,并且是bug的来源 当我声明一个@property但忘记用@synthesis或手动实现它时,会发生什么?当我使用@synthesis并忘记@property声明时

据我所知,@property在.h文件中声明getter和setter,@synthesis在.m文件中实现getter和setter。此外,还可以为getter和setter编写自己的实现,而不是使用@synthesis

那么,如果我们总是需要实现setter/getter,为什么还要额外声明它呢@属性在语义上对我来说似乎是多余的,并且是bug的来源

当我声明一个@property但忘记用@synthesis或手动实现它时,会发生什么?当我使用@synthesis并忘记@property声明时会发生什么

当我声明@property但忘记实现它时会发生什么 使用@synthesis还是手动?当我使用@synthesis和 忘记@property声明了吗

你为什么不试试呢?如果您忘记合成访问器或提供自己的访问器,编译器将警告您。(如果将其设置为将警告视为错误,这是一个好主意,那么不可能错过警告。)第二种情况通常会导致编译错误

那么,如果我们总是需要实现setter/getter,为什么我们需要这样做呢 另外申报吗@属性在语义上似乎是多余的 我和一个臭虫的来源


简单地说,
@property
是一种属性声明,
@synthesis
是一种可能的实现。一个属于头(=公共接口描述),另一个属于实现文件。如果不是这样的话,你会怎么做呢?

在.h文件中包含以下内容

@property (retain, nonatomic) NSString* userName;
语法上的糖是什么

-(NSString*)userName;

-(void)setUserName:(NSString*)userName;
在.h文件中

@synthesis
in.m是一种语法糖,它通过尊重您在属性声明中指定的
保留
非原子
等,为自己的实现提供语法支持

即使在.h文件中指定了合适的getter、setter签名,您也无法在没有out@property的情况下进行合成

但是您可以离开@synthesis并实现自己的getter和setter


如果您同时使用@synthesis和自定义getter setter,那么运行时将尊重您的实现并调用相同的实现。

只是想补充一点,您也可以使用@dynamic而不是@synthesis,尽管这很少是您需要做的事情@dynamic基本上是告诉编译器,您将以某种方式确保在运行时处理对getter和setter的调用,方法是自己创建getter和setter,或者对Objective C运行时的一些特殊功能进行额外的处理。

现在默认情况下合成属性,因为Xcode 4.4,所以是的,你是对的,它是多余的,苹果不再需要同时编写@property和@synthesis,从现在起只需使用@property即可。

很高兴他们添加了这个。感谢您的回复。在这种情况下,您仍然需要同时使用属性和合成。编译器将使用属性名加下划线前缀来创建ivar。如果ivar_propertyname与私有实例变量冲突,则需要将其合成为新的ivar。例如:如果您正在子类化UIToolbar,并声明一个将其命名为delegate的属性,则尝试使用ivar\u委托时会出现错误,因为UIToolbar包含一个私有实例变量id\u delegate。您可以使用
@synthesis delegate=\u mydelegate。我对这个“不知何故”很感兴趣。我想用字典支持一些点样式的属性,但完全失败了。可能是一个问题。