2011-01-19 25 views
7

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

我最近被暴露在使用了很多self->的代码中,我将使用一个属性。当我说我使用@property(保留)的原因之一是因为我不想明确保留我的对象,我被告知我是“懒惰的”。这可能是真的,但我也想避免我忘记保留的错误。

不管怎样,一般来说,你们怎么看待Cocoa代码中的->

+4

自我>‘“最近,我用了很多的暴露为代码’。 ..转身......跑开!!!! – 2011-01-19 15:57:53

回答

6

懒惰是一种美德。

我在copyWithZone:中使用->来访问副本的实例变量。 (我在这里没有使用属性访问器,原因与我在initdealloc中不使用它们的原因相同 - 它们可能会引发在半初始化副本中会出现问题的副作用。)我在此上下文中也使用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

国际海事组织没有太多的价值使用 - >超过普通伊娃尔访问。如果你想访问不同的对象的ivars,有时它对于调试的目的很有用。如果仅仅是区分ivars与本地变量,那么您可以使用其中一种既定的命名方案(在此不要详述)。

使用属性是一个完全不同的故事。国际海事组织在大多数情况下应该倾向于使用财产而不是简单的财产自动保留是一个原因,另一个很好的抽象。

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所指出的那样,您可以在像copyWithZone这样的方法中使用->像C++的Friend,但是,如果你没有这样做,那就远离它吧!


[编辑]

另外,如果你要挤表现出来的对象,你知道你与该对象或成员做什么,那么你可以使用->跳过方法查找的开销。但是,即使如此,如果性能为这个问题很大,您可能只想用C或C++编写这些代码段。

哦,另外,我不认为使用->是线程安全的。如果你的getter/setter使用@synchronize,则使用->将绕过安全警卫。

+0

其实,我相信所有的实例变量(成员)默认是`@ protected`,而不是`@ private`。 – NSGod 2011-01-19 19:59:26

1

self->variable是多余的,因为你会得到与自己引用ivar一样的效果。一般来说,->运营商就派上用场了,当你要访问的是在另一个例如,如伊娃:

@implementation MyClass 

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

@end 
相关问题