Objective-C:没有实现的@property声明(@synthesize)

Ste*_*Arn 8 properties objective-c

据我所知,@ property表示.h文件中的getter和setter,而@synthesize在.m文件中实现了getter和setter.此外,可以为getter和setter编写自己的实现,而不是使用@synthesize.

因此,如果我们总是需要实现setter/getter,为什么我们需要另外声明呢?@property似乎对我来说是语义冗余,也是bug的来源.

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

ste*_* k. 26

现在默认情况下合成属性,因为Xcode 4.4,所以是的,你是对的,它是多余的,Apple删除了编写@property和@synthesize的需要,从现在开始只使用@property.

  • 还有一种情况需要同时使用属性和合成.编译器将使用属性名称加下划线前缀来创建ivar.如果ivar _propertyname与私有实例变量发生冲突,则需要将其合成为新的ivar.例如:如果您是UIToolbar的子类,并声明一个命名为delegate的属性,那么尝试使用ivar _delegate会出错,因为UIToolbar包含一个私有实例变量id _delegate.您可以使用`@synthesize delegate = _mydelegate;`来解决这个问题. (8认同)

Sar*_*ran 6

在.h文件中有下面

@property (retain, nonatomic) NSString* userName;
Run Code Online (Sandbox Code Playgroud)

是语法糖

-(NSString*)userName;

-(void)setUserName:(NSString*)userName;
Run Code Online (Sandbox Code Playgroud)

在.h文件中

而@synthesize在.M是离开了自己实施的语法糖尊重你的retain,nonatomic等在你的财产申报规定.

你不能用@property合成,即使你在.h文件中指定了合适的getter,setter签名.

但是你可以离开@synthesize并实现你自己的getter和setter.

如果同时执行@synthesize和自定义getter setter,则运行时会尊重您的实现并调用相同的实现.