目标-c中的箭头运算符

我有一个问题,这里是代码:

@interface MyFoo : NSObject { NSString *nameStr; } @end @implementation MyFoo - (id)init { self = [super init]; if (self) { self->nameStr = [@"some value of the string that is set right into the private ivar" copy]; } return self; } @end 

问题是:忽略所有C ++规则,忽略内存转储漏洞,为什么我不应该使用这样的箭头运算符语法? 苹果文档中是否有一个规则说明这是不正确的,因为将来的类可能不同于指向运行时结构的指针等。

提前致谢!

self->someIvar的使用与self->someIvar相同。 这没有错,但也不需要。

唯一一次我使用箭头符号是在一个copyWithZone:的实现copyWithZone:所以我可以复制每个没有属性的ivars。

 SomeClass *someCopy = ... someCopy->ivar1 = ivar1; // = self->ivar1 someCopy->ivar2 = ivar2; // = self->ivar2 

你在哪看到什么说你不应该使用这样的箭头运算符语法?

只使用箭头符号来访问财产并不能保证他们将被保留,分配等等。因为你正在指导访问一个伊娃,而不是调用和设置器或属性中使用的getter方法。

例:

 @interface MyFoo : NSObject { } @property(nonatomic,retain) NSString *nameStr; @end @implementation MyFoo - (id)initWithString:(NSString *)name { self = [super init]; if (self) { self->nameStr = name; // will not be retained } return self; } @end 

对于伊娃variables来说,已经没有什么问题了。

使用箭头符号并不正确,并且使用箭头和点符号有所不同。如果使用箭头运算符访问实例variables,如果使用点运算符访问属性。
它不像C结构那样使用箭头符号来访问指向结构的成员,而使用点符号来访问结构成员。 所以我会做一个有意义的例子:

 @property (nonatomic,strong) NSString* text; 

在.m文件中:

 - (void) setText: (NSString*) string { NSLog(@"Accessing property"); self->text=string; // let's suppose that text is not synthesized } 

如果你使用点符号,那么你访问属性,它会打印“访问属性”。但这不与C结构的语法。