使用 - >在可可

时间:2011-01-19 14:50:40

标签: objective-c cocoa

我习惯于为几乎所有东西创建属性。可能太多,给出了。我也使用了实例变量,但我没有用self->myvar引用它们,而只是myvar

我最近接触过使用大量self->的代码,我会使用一个属性。当我说使用@property(保留)的原因之一是因为我不想明确地保留我的对象时,我被告知我“懒惰”。这可能是真的,但也是我想避免我忘记保留的错误。

无论如何,一般来说,你们在Cocoa代码中对->的看法是什么?

4 个答案:

答案 0 :(得分:6)

懒惰是一种美德。

我在->中使用copyWithZone:来访问副本的实例变量。 (我在这里不使用属性访问器的原因与initdealloc中不使用它们相同 - 它们可能会触发半初始化副本中不良的副作用。)I在这种情况下也使用self->,因为我喜欢读取的方式:

other->foo = [self->foo copy];
other->bar = [self->bar copy];
other->baz = self->baz; //Non-object or object not owned (may be omitted entirely in the latter case)

我想不出另一个在对象上使用->的上下文。

答案 1 :(得分:1)

IMO在使用中没有多大价值 - >通过普通的ivar访问。如果您想访问其他对象的ivars,有时它对调试很有用。如果它只是将ivars与本地变量区分开来,你可以使用已建立的命名方案之一(这里不再详述)。

使用属性是一个完全不同的故事。在大多数情况下,IMO应该更喜欢使用属性而不是普通的ivars。自动保留是一个原因,另一个很好的抽象。

答案 2 :(得分:1)

对于你所做的大多数事情,除非你用Objective-C编写C或C ++代码,否则不要使用->。如果您创建属性并适当地引用它们,则对您,编译器和内存管理更容易。

@interface MYObject : NSObject {
@public // don't use this, please!
    MYOtherObject *obj;
}

@property (retain) MYOtherObject *obj;

@end

@implementation MYObject

@synthesize obj;

@end


// later in your code

MYObject *thing = [[MYObject alloc] init];
MYOtherObject *other;

// Good
other = [thing obj];
other = thing.obj;
other = [thing valueForKey:@"obj"]; // I hope my KVC is correct here.  :(

// Bad, and soon to be deprecated I believe. (all members are @protected unless you use @public)
other = thing->obj;

为什么不好?您可以在实现文件中声明成员,如下所示:(64位和iPhone)

@interface MYObject : NSObject

@property (retain) MYOtherObject *obj;

@end

@implementation MYObject

@synthesize obj = _obj;

@end

在这里,调用thing->obj只会产生错误,因为成员是在运行时动态分配的。

另外,正如用户@Peter Hosey指出的那样,你可以像->这样的方法使用Friend像C ++的copyWithZone,但是,如果你不做那样的话,那就留下来吧远!


[编辑]

此外,如果您尝试从对象中挤出性能并且知道您正在使用该对象或成员执行的操作,那么您可以使用->跳过该方法-lookup的开销。然而,即便如此,如果性能那么你可能只想用C或C ++编写这些部分。

哦,另外,我不认为使用->是线程安全的。如果您的getter / setter使用@synchronize使用->将绕过保护措施。

答案 3 :(得分:1)

self->variable是多余的,因为你将获得与引用ivar本身相同的效果。通常,当您要访问的内容是另一个实例中的ivar时,->运算符会派上用场,例如:

@implementation MyClass

- (void) beLikeThisOtherThing:(MyClass *) foo
{
someVariable = foo->someVariable;
}

@end