将宣布在ObjC类的属性重写那是公共接口上声明的同一名称的属性?

问题描述 投票:3回答:2

这不是要解决的特殊问题,只是希望了解Objc性质的细微差别。

说我有一个类Dude

# Dude.h

@interface Dude: NSObject

@property (readonly, nonatomic) NSNumber *height;

@end

我谨向在执行文件中的类,但更改属性。

# Dude.m

@interface Dude()

@property (readwrite, atomic) NSNumber *height;

@end


@implementation Dude
@end

我得到一个错误。

“原子”属性在属性“高度”不匹配“花花公子”继承的财产

那么,什么是真正回事。是在扩展相同属性的属性?我只是重写访问器?

此外,当我改变顺序,使公共接口是readwrite而是通过专用接口是readonly我得到的错误:

在类扩展“哥们”属性非法重新声明(属性必须是“读写”,而它的主要必须是“只读”)

这让我觉得这是一个完整的重新声明,但现在我什么是实际发生的情况不太确定。寻找澄清。

objective-c
2个回答
1
投票

在苹果公司的The Objective-C Programming Language,他们描述的“扩展”,如下所示,使用属性为例的重声明:

Extensions

类扩展是像匿名类,除了它们声明的方法必须在对应的类主@implementation块来实现。使用锵/ LLVM编译器2.0,您还可以在一个类扩展声明属性和实例变量。

类扩展的常见用法是重新声明为只读私下为读写是公开声明的属性:

@interface MyClass : NSObject
@property (retain, readonly) float value;
@end

// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

...

因此,如这里所示,这种模式是“重新声明”的属性。这是同样的属性,虽然。当你想编译器合成,即使公共接口被声明为readonly私人二传手您只需重新声明的属性。如果不重新声明属性作为readwrite在延伸,一个setter将无法在所有的合成。

你的各种警告实际上说明我们正在处理相同的属性,因为仅仅是例子,其中的重声明的本质不是什么被列入公共接口兼容的事实。


3
投票

你可以认为这更像是一个公共和私有接口。

在.h文件中声明的接口是类的公共接口。所以,如果你有一个理由只读声明属性是有意义那里。

在.m文件的无名类(多德())是你的私人视线上的属性。所以,你可以指定读写这里让你的类能够内部而不是改变属性到外面的世界。

您也可以使用这些声明的方法来声明在接口多德h和私有方法()中的.m一个公共接口。

在您的公共和私有接口组合必须是有意义的,你不能宣布一个公共财产读写并在内部说,这仅仅是只读...

最后,这是Objective-C的:这只是你的编辑器和编译器。一切存在即使它被宣布某种形式的私人访问。

© www.soinside.com 2019 - 2024. All rights reserved.