我有一个问题,这是代码:
@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文档中是否存在一个规则,表明它是不正确的,因为将来的类可能与运行时等结构的指针表示不同?
提前致谢!
答案 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结构语法无关。