18

我有个问题,代码如下:

@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文档中是否有一条规则说它是不正确的,因为在未来的类可能与运行时中指向结构的指针等表示不同?

提前致谢!

4

3 回答 3

18

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

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

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

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

于 2012-12-17T18:26:29.207 回答
5

仅在 ivar 名称上使用箭头表示法来访问属性并不能保证它们将被保留、分配或等...因为您正在指导访问 ivar 而不是调用和设置属性中使用的 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 变量,没有任何问题。

于 2012-12-17T18:29:35.357 回答
3

使用箭头表示法并没有错,使用箭头表示法和点表示法是有区别的。如果使用箭头运算符,则访问实例变量,如果使用点运算符,则访问属性。
它不像 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 结构语法无关。

于 2012-12-17T18:26:02.193 回答