objective-c中的箭头操作符

时间:2012-12-17 18:21:09

标签: ios objective-c runtime

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

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

提前致谢!

3 个答案:

答案 0 :(得分:17)

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

我使用箭头符号的唯一时间是copyWithZone:的实现,因此我可以复制每个没有属性的ivars。

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

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

答案 1 :(得分:4)

在ivar名称上使用箭头表示法来访问某个属性并不能保证它们会被保留,分配等等...... 因为您正在指导访问ivar而不是调用和设置属性中使用的setter ou 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

对于已经回答的ivar变量,没有任何错误。

答案 2 :(得分:2)

使用箭头符号并不正确,并且使用箭头和点符号之间存在差异。如果使用箭头操作符可以访问实例变量,如果使用点运算符,则可以访问属性。
它不像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结构语法无关。