gpt4 book ai didi

objective-c - Objective C 中的实例变量/方法参数命名

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

这里的人们在命名实例变量和方法参数时遵循什么约定 - 特别是当方法参数用于设置 ivars(实例变量)时?

在 C++ 中,我经常为 ivar 使用 m_ 前缀。在 C# 中,我遵循了纯粹使用 this. 来消除歧义的惯例。从那以后,我也采用了 C++ 中的等效项 (this->)。

在 Objective C 中,我尝试了一些东西,但没有一个看起来真正令人满意。

除非有人提出非常好的建议,否则我不得不妥协(但请不要让我对 args 使用 the 前缀!),所以我'我很想听听大多数人怎么说 - 特别是那些已经使用 ObjC 一段时间的人。

在发布这篇文章之前我做了一些尽职调查,并在以下位置找到了一些很好的资源:

他们给了我一些想法,但我仍然很想听听其他人在做什么。

[编辑]澄清一下:我正在寻找的具体是如何区分 ivars 和方法参数 - 无论是通过前缀还是其他一些技术。

[编辑 2]感谢所有回复和讨论要点。我不会关闭它,但只会说,正如我在对已接受答案的评论中指出的那样,我已经采用了在 init args 前加上 the 前缀的约定(以及在 setter args 前加上 new,反正我一直在做)。这似乎是最佳的力量平衡 - 即使我自己并不热衷于审美。

最佳答案

正如您所注意到的,Cocoa 风格是在参数名称与实例变量冲突时使用方法参数名称,如 theValue。然而,这在 Objective-C 2.0 风格的代码中应该不会出现很多次。假设你不应该(通常)直接访问实例变量。这主要是因为这样做绕过了 Cocoa 中的键值观察机制。相反,期望您将通过 getter/setter 方法访问和改变属性。在 Objective-C 2.0 中,很容易声明这些属性并自动@synthesize getters/setters,因此没有太多理由不使用它们。事实上,在 64 位系统上,运行时会自动为您创建实例变量,无需声明它们并减少使用它们的冲动。

唯一应该直接访问实例变量的地方是在 -init-dealloc 方法中:

@interface MyObject : NSObject 
{
id ivar;
}

@property (retain,readwrite) id ivar; //or whatever retain/copy/assign and read/readwrite makes sense
@end

@implementation MyObject
@synthesize ivar;

- (id)initWithIvar:(id)theIvar {
if(self = [super init]) {
ivar = theIvar;
}

return self;
}

- (void)dealloc {
[ivar release];
}

在这些情况下应直接使用 ivar 的原因是因为 getter/setter 可能会产生依赖于完全初始化实例的副作用,从而使它们在 -init 中很危险-dealloc 其中对象的状态被完全初始化。在所有其他情况下,您应该使用 self.ivar(或 [self ivar][self setIvar:newValue])。

似乎-initWithXX 以外的方法不应该有命名冲突。如果他们这样做,是否应该将它们重构为没有该参数或类没有实例变量?

这只剩下 -initWithXX 方法,您经常会在这些方法中发现参数和 ivar 之间的冲突。对于这种情况,如果您真的无法忍受 Cocoa 风格,您可以使用您提到的任何方法。以 _ 为前缀是可行的并且相对常见(我相信 @synthesize 的 setter 和 getter 在这种情况下会自动做正确的事情,但您可能必须明确设置_ivar 作为支持)。

关于objective-c - Objective C 中的实例变量/方法参数命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/549962/

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