gpt4 book ai didi

objective-c - 在类扩展中声明新属性在 Objective-C 中是一种不好的做法吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:23 24 4
gpt4 key购买 nike

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

//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

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

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

最佳答案

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

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

关于objective-c - 在类扩展中声明新属性在 Objective-C 中是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com