我有类A
,它公开了获取和设置Foo
类型对象的方法。在属性术语中,我通常在接口中声明这一点:
@property (nonatomic, strong) Foo * foo;
这(在现代ObjC中)生成访问器和用于存储的ivar,_foo
。
如果我想在访问器中执行自定义工作,我可以自己实现其中的一个或两个。但是,如果我不仅想做定制的工作,实际上我不想要象牙?换句话说,我正在对Foo对象执行其他操作,比如将它来回传递给另一个由我组成的内部对象。实际上,我根本不需要在foo
实例中为A
保留存储。
我似乎有两个选择:
_foo
创建存储的事实,而从不使用它。- (Foo *)foo
和- (void)setFoo:(Foo *)foo
,就像我在前现代ObjC中所做的那样。第一个在运行时看起来不优雅,而第二个在声明中似乎不优雅(在声明中,我可能已经将属性和类似属性的访问器混合在一起了)。
是否有一种方法来申报一项财产,并使其成为纯粹的申报?
发布于 2013-10-27 16:02:24
如果覆盖setter和getter,并且不使用setter和getter中的变量,则不会创建变量。
例如,如果您的类需要一个firstName
和lastName
属性,但也可能是fullName
属性的setter
和getter
,那么如果您的fullName
setter只是将字符串解析为firstName
和lastName
,并将这些属性设置为firstName
和lastName
(并且从不将完整字符串存储到fullName
变量中),并且您的d9 getter简单地d10连接的firstName + lastName,并且从不使用d13变量,那么就永远不会创建一个。
这是根据苹果的官方文件。
向下滚动到“您可以实现自定义访问器方法”
发布于 2013-10-27 15:55:32
在实现文件中使用@dynamic
关键字。通常对@dynamic
的讨论将其描述为在编译时没有创建访问器。通常没有提到的是,也具有不为属性创建存储的效果,在这种情况下,这正是所希望的。
@implementation A
@dynamic foo;
- (Foo *)foo
{
// get a Foo from somewhere and return it.
}
- (void)setFoo:(Foo *)foo
{
// do something with foo
}
@end
(注:我在写问题时发现了这个问题,就回答了我自己的问题,这似乎既有趣又不明显。)
发布于 2013-10-27 16:08:22
@dynamic
可能是该走的路。
但是,还有两种方法可以做到这一点:
@implementation Foo (UnimplementedProperties)
)的实现,就不会合成属性。https://stackoverflow.com/questions/19625162
复制相似问题