objective-c中的箭头操作符

art*_*vin 14 runtime objective-c ios

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

@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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

rma*_*ddy 17

使用self->someIvar方法相同someIvar.这没错,但也不需要.

我使用箭头符号的唯一一次是执行,copyWithZone:所以我可以复制每个没有属性的ivars.

SomeClass *someCopy = ...
someCopy->ivar1 = ivar1; // = self->ivar1
someCopy->ivar2 = ivar2; // = self->ivar2
Run Code Online (Sandbox Code Playgroud)

你在哪里看到任何说不应该使用这种箭头操作符语法的东西?

  • 你不应该使用 - >在非常罕见的情况下进入另一个对象的ivars(执行`copyWithZone:`是唯一的一个). (6认同)
  • 使用"self"时,这是一种风格问题.访问除"self"以外的对象实例的ivars时需要它. (3认同)

Gui*_*tro 5

仅在 ivar 名称上使用箭头符号来访问属性并不能保证它们将被保留、分配或等等......因为您正在指导访问 ivar 而不是调用和设置属性中使用的 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
Run Code Online (Sandbox Code Playgroud)

对于已经是答案的 ivar 变量,没有任何问题。

  • 他没有询问将它与属性一起使用。他询问是否将它与 ivars 一起使用。您不能将箭头用于属性,而是将点用于属性。重读问题然后我的答案。不涉及属性。他也没有以任何方式询问内存管理。 (2认同)