gpt4 book ai didi

objective-c - 在内部访问实例变量时应该使用属性还是直接引用?

转载 作者:太空狗 更新时间:2023-10-30 03:15:39 25 4
gpt4 key购买 nike

假设我有这样一个类:

@interface MyAwesomeClass : NSObject
{
@private
NSString *thing1;
NSString *thing2;
}
@property (retain) NSString *thing1;
@property (retain) NSString *thing2;
@end

@implementation MyAwesomeClass
@synthesize thing1, thing1;
@end

当访问 thing1thing2 internally(即在 MyAwesomeClass 的实现中)时,是否更好使用该属性,或者直接引用实例变量(假设我们在“自定义”访问或修改器中不做任何工作的情况,即,我们只是设置和获取变量)。在 Objective C 2.0 之前,我们通常只是直接访问 ivars,但现在通常的编码风格/最佳实践是什么?如果一个实例变量/属性是私有(private)的并且根本无法在类之外访问,那么这个建议会改变吗?您应该为每个 ivar 创建一个属性,即使它们是私有(private)的,还是只为面向公众的数据创建一个属性?如果我的应用不使用键值编码功能怎么办(因为 KVC 仅针对属性访问触发)?

我有兴趣超越底层技术细节。例如,给定(次优)代码如下:

@interface MyAwesomeClass : NSObject
{
id myObj;
}
@proprety id myObj;
@end

@implementation MyAwesomeClass
@synthesize myObj;
@end

我知道 myObj = anotherObject 在功能上与 self.myObj = anotherObj 相同。

当然,属性不仅仅是指示编译器为您编写访问器和修改器的花哨语法;它们也是一种更好地封装数据的方法,即,您可以更改类的内部实现,而无需重写依赖这些属性的类。在处理类自己的内部 代码时,我对解决此封装问题的重要性的答案很感兴趣。此外,正确编写的属性可以触发 KVC 通知,但直接访问 ivar 不会;如果我的应用现在不使用 KVC 功能,以防将来可能,这有关系吗?

最佳答案

如果您花时间浏览 cocoa-dev 邮件列表,您会发现这是一个非常有争议的话题。

有些人认为 ivars 应该只在内部使用,除了外部之外永远不应该(或很少)使用属性。 KVO 通知和访问器副作用存在各种问题。

有些人认为您应该始终(或主要)使用属性而不是 ivar。这里的主要优点是您的内存管理很好地包含在访问器方法中,而不是散布在您的实现逻辑中。 KVO 通知和访问器副作用可以通过创建指向相同 ivar 的单独属性来克服。

查看 Apple 的示例代码会发现他们在这个主题上无处不在。一些示例在内部使用属性,一些使用 ivar。

我会说,一般来说,这是一个品味问题,没有正确的方法。我自己混合使用这两种风格。

关于objective-c - 在内部访问实例变量时应该使用属性还是直接引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753130/

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