我有点困惑在类内部访问实例变量时,使用self和直接使用变量名的区别。
例如,看看这个类:
//In .h file:
@interface Register : NSObject {
NSString *mName;
}
- (id) initWithName:(NSString *) name;
//In .m file:
- (id) initWithName:(NSString *)name
{
if (self == [super init])
{
mName = name;
}
return self;
}
什么是通过以下方式访问实例变量的区别:
self.mName = name;
vs
mName = name;
这不是@property,也没有被@sythenize。
举个例子:
//In .h file:
@interface Manange_My_ViewsViewController : UIViewController {
IBOutlet UILabel *countLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *countLabel;
//In .m file:
@synthesize countLabel;
- (void) updateLabel:(NSUInteger)count
{
countLabel.text = [NSString stringWithFormat:@"%d", count];
}
但是如果我这样访问countLabel:
self.countLabel
有什么区别呢?
编辑:根据用户的回答,第三个例子:
如果iVar不是IBOutlet,那会有什么不同呢?
//In .h file:
@interface Fake : NSObject {
NSString *mVar;
}
@property (nonatomic, retain) NSString *mVar;
//In .m file:
@synthesize mVar;
mVar = @"";
VS
self.mVar = @"";
那么这两种方式是相同的吗?第一种方式我们正在访问实际的实例变量,而第二种方式我们通过 @synthesize 自动生成的 setter 进行访问?
谢谢大家!
编辑:响应 Peter Hosey 的更新...
所以你认为 mVarName 的命名约定不好吗?我从 C++ 时代学来的。
但如果你这样做呢?
-(void) someMethod:(int) x
{
x = x;
}
你不能这样做(说“x”也是一个类变量)
但是你可以这样做:
-(void) someMethod:(int) x
{
mX = x;
}
但是您的意思是最好这样做:
-(void) someMethod:(int) x
{
self.x = x;
}