【问题标题】:Is declare new property in class extension a bad practice in Objective-C?在类扩展中声明新属性在 Objective-C 中是一种不好的做法吗?
【发布时间】:2011-04-12 16:51:53
【问题描述】:

类扩展的一个强大优势是,通过类扩展,您可以在头文件中声明一个只读属性,并在类扩展中将该属性覆盖为读写属性。如下:

//SomeClass.h

@interface SomeClass : NSObject
{
    NSInteger someInt;   //with modern runtime you can omit this line
}
@property (readonly) NSInteger someInt;
@end

//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end

@implementation SomeClass
@synthesize someInt;
@end

但是,如果您使用现代运行时,您还可以在类扩展中声明一个全新的属性(如果没有,它还会为该属性生成一个 iVar)。

//SomeClass.h

@interface SomeClass : NSObject
{
}
@end

//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end

@implementation SomeClass
@synthesize someInt;
@end

这是我的问题:我认为在类扩展中声明一个全新的属性在某种程度上会产生一些副作用。因为类扩展名不在头文件中,并且子类化该类的其他人可能不知道该“秘密属性”。如果他声明一个与该“秘密财产”同名的财产。而这个新属性的 getter 和 setter 方法将覆盖超类的。这不是问题吗?为什么现代运行时会允许这样的事情发生?

编辑我发布了关于此主题的另一个问题,请查看: The risk of declare new propery in class extension (Ojbective-C) , how to solve it?

【问题讨论】:

  • 是的,这是一个很好的做法。不要害怕!

标签: objective-c properties class-extensions modern-runtime


【解决方案1】:

我不认为在类扩展中声明一个新属性是不好的做法。我经常这样做。首先在标头中包含 readonly 属性的唯一原因是允许其他类获取该值,而只有您可以修改它。很多时候,该 ivar 应该与其他类无关,并且只是一个实现细节。因此,它在头文件中没有位置。

将此 ivar 实现为私有属性(仅在类扩展中声明的新属性)仍然有用,因为它可以为您抽象方便的内存管理样板代码。不幸的是,名称冲突在 Objective C 中只是生活中的一个事实。Apple 为您提供了一些非常清晰的 naming conventions 供您遵循(或遵循)以防止与它们的方法名称发生冲突。如果您担心与您使用该私有属性无形地创建的 getter 和 setter 发生冲突,只需对那些您在实现私人财产。这是您使用 Objective C 所能做的最好的事情,但我个人认为好处大于风险。

【讨论】:

  • +1 好答案。你也有这个苹果文档的网址吗?
  • @Martin:是的。为了好奇,我编辑了答案以链接到它。
  • @Johnathan 我发布了关于此主题的另一个问题,请查看:stackoverflow.com/questions/5643893/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2015-05-31
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多