繁体   English   中英

objective-c 中的 @property 和 @synthesize

[英]@property and @synthesize in objective-c

当我在玩并弄清楚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 创建了新名称。 (我的理解正确吗?)

但是我仍然不明白为什么他们必须用那些 @synthesize = 指令使事情变得复杂。

它有多复杂,真的吗? 它只是一种语法,可让您指定要用于支持您告诉编译器为其创建访问器的属性的 ivar。 如果他们没有提供这个或类似的东西,那么您总是必须让您的属性名称与您的 ivar 名称相匹配,并且您可能不希望这样做。

如果您不需要以不同的方式命名您的 ivar,那么您不必费心指定 ivar 名称。 事实上,您根本不必为您的属性创建 ivars……如果您不这样做,编译器将为您创建它们。

更新:截至 2013 年中,LLVM 默认为属性合成访问器,因此在大多数情况下,您根本不再需要指定@synthesize 您仍然会使用它的一种情况是,当您想要使用与编译器为您生成的实例变量不同的实例变量来支持属性时。 此外,支持属性的 ivar 的默认名称将是带有下划线前缀的属性名称。 因此,可以通过删除以下行来简化 OP 示例中的代码:

id _delegate;

和:

@synthesize delegate=_delegate;

我已经删除了我之前反对使用下划线前缀的建议,因为它显然不同意编译器的当前时尚和默认行为。 然而,据我所知,在方法名称中使用下划线前缀仍然是一种糟糕的形式。

此外,我注意到至少有一个人解释了我回答的第一行,“它有多复杂,真的吗?” 作为居高临下的。 我希望这只是一个人的印象——我绝对没有任何居高临下的意思,而只是试图围绕 OP 的断言来构建我的回应@synthesize xxx=_xxx; 指令使事情变得复杂。 刚开始的时候有很多东西要吸收; 希望新的“默认合成”行为能够减轻新手的负担。

你是对的,使用

@synthesize foobar=_foobar;

在大多数情况下有点毫无意义,但在抽象层面上,它确实允许您完全返回某个其他变量的值。 如...

@synthesize foobar=fluffybunny;

让您在每次使用访问器.foobar时获取或设置fluffybunny的值

然而,就@synthesize的复杂性而言,你愿意写吗?

-(void)setFoobar:(id)aobject {
    [self willSetValueForKey:"foobar"];
    id old = foobar;
    foobar = [aobject retain];
    [old release];
    [self didSetValueForKey:"foobar"];
}

-(id)foobar {
    [self willAccessValueForKey:"foobar"];
    id obj = [self primitiveValueForKey:@"foobar"];
    [self didAccessValueForKey:"foobar"];    
    return obj;
}

或者

@synthesize foobar;

那写得不是特别好,因为我忘记了如何做好它们,但是@synthesize 指令阻止了你多次编写访问器。 这是对 Obj-C 1.0 的严重影响之一。

免费代码,不要敲它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM