当我在玩并弄清楚 https://github.com/enormego/EGOTableViewPullRefresh 中的事情是如何运作的时候我发现@property 和@synthesize 很神秘。这是我提到的代码
EGORefreshTableHeaderView.h
@interface EGORefreshTableHeaderView : UIView {
id _delegate;
EGOPullRefreshState _state;
UILabel *_lastUpdatedLabel;
UILabel *_statusLabel;
CALayer *_arrowImage;
UIActivityIndicatorView *_activityView;
}
@property(nonatomic,assign) id <EGORefreshTableHeaderDelegate> delegate;
EGORefreshTableHeaderView.m
@synthesize delegate=_delegate;
我读过这个http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html据我了解,它为 _delegate 创建了新名称,即 delegate。 (我的理解对吗?)
但我仍然不明白为什么他们必须使用那些 @synthesize = 指令让事情变得复杂。
最佳答案
它到底有多复杂?它只是一些语法,可让您指定要用于支持您告诉编译器为其创建访问器的属性的 ivar。如果他们没有提供这个或类似的东西,那么你总是必须让你的属性名称与你的 ivar 名称相匹配,并且有一些你可能不希望这样做的原因。
如果您不需要以不同的方式命名您的 ivar,那么您就不必费心指定 ivar 名称。事实上,您根本不必为您的属性创建 ivar...如果您不这样做,编译器会为您创建它们。
更新:截至 2013 年年中,LLVM 默认为属性合成访问器,因此在大多数情况下您根本不再需要指定 @synthesize
。您仍然会使用它的一种情况是,当您想要使用与编译器为您生成的实例变量不同的实例变量来支持该属性时。此外,支持属性的 ivar 的默认名称将是带有下划线前缀的属性名称。因此,可以通过删除以下行来简化 OP 示例中的代码:
id _delegate;
和:
@synthesize delegate=_delegate;
我已经删除了我之前反对使用下划线前缀的建议,因为它显然不符合编译器当前的时尚和默认行为。然而,据我所知,为您的方法名称使用下划线前缀仍然是一种糟糕的形式。
此外,我注意到至少有一个人解读了我的第一行回复,“它有多复杂,真的吗?”居高临下。我希望这只是一个人的印象——我绝对没有任何居高临下的意思,而只是试图围绕 OP 的断言来构建我的回应,即 @synthesize xxx=_xxx;
指令使事情变得复杂.刚开始的时候有很多东西要吸收;希望新的“默认合成”行为能够减轻新手的负担。
关于objective-c - objective-c 中的@property 和@synthesize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814811/