【问题标题】:Objective-C: @property declaration without implementation (@synthesize)Objective-C:没有实现的@property 声明(@synthesize)
【发布时间】:2011-11-21 17:26:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c properties


    【解决方案1】:

    现在默认合成属性,从 Xcode 4.4 开始,所以是的,你是对的,这是多余的,Apple 不再需要同时编写 @property 和 @synthesize,从现在开始使用 @property。

    【讨论】:

    • 很高兴他们添加了这个。感谢您的回复
    • 仍有一种情况需要同时使用属性和综合。编译器将使用属性名称加上下划线前缀来创建 ivar。如果 ivar _propertyname 与私有实例变量冲突,则需要将其合成为新的 ivar。例如:如果你是 UIToolbar 的子类,并声明了一个属性命名它委托你会得到一个错误尝试使用 ivar _delegate 因为 UIToolbar 包含一个私有实例变量 id _delegate。你可以使用@synthesize delegate = _mydelegate;来解决这个问题。
    【解决方案2】:

    在 .h 文件中有以下内容

    @property (retain, nonatomic) NSString* userName;
    

    是语法糖

    -(NSString*)userName;
    
    -(void)setUserName:(NSString*)userName;
    

    在 .h 文件中

    和 .m 中的 @synthesize 是语法糖,通过尊重您的属性声明中指定的 retainnonatomic 等,可以自行实现。

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

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

    如果您同时使用 @synthesize 和自定义 getter 设置器,则运行时会尊重您的实现并调用相同的方法。

    【讨论】:

      【解决方案3】:

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

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

      所以如果我们总是需要实现 setter/getter 为什么我们需要 另外申报吗? @property 似乎在语义上是多余的 我和错误的来源。

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

      【讨论】:

        【解决方案4】:

        只是想补充一点,您也可以使用@dynamic 代替@synthesize,尽管您很少需要这样做。 @dynamic 基本上是在告诉编译器您以某种方式要确保对 getter 和 setter 的调用将在运行时得到处理,要么自己制作,要么做一些额外的事情弄乱了 Objective C 运行时的一些特殊功能。

        【讨论】:

        • 我对那个“不知何故”感兴趣。我想用字典支持一些点样式属性,但完全失败了。可能是一个问题的结果。
        猜你喜欢
        • 2013-11-19
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多