objective C下划线变量和自身变量不同
objective C underline variable and self variable different
我正在开发斯坦福大学的演示应用程序 ios7,问题如下:
#import "YSHViewController.h"
@interface YSHViewController ()
@property (weak, nonatomic) IBOutlet UILabel *flipsLable;
@property (nonatomic) int flipCount;
@end
@implementation YSHViewController
- (void)setFlipCount:(int)flipCount
{
_flipCount = flipCount;
_flipsLable.text =[NSString stringWithFormat:@"Flips: %d",_flipCount]; // not working
NSLog(@"%@", _flipsLable.text);
NSLog(@"%@", self.flipsLable.text);
self.flipsLable.text = [NSString stringWithFormat:@"Flips: %d",_flipCount];
}
- (IBAction)touchCardButton:(UIButton *)sender {
//if (sender.currentTitle.length != 0) {
if ([sender.currentTitle length]) {
//UIImage *cardImage = [UIImage imageNamed:@"cardback"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardback"]
forState:UIControlStateNormal];
[sender setTitle:@"" forState:UIControlStateNormal];
} else {
//UIImage *cardImage = [UIImage imageNamed:@"cardfront"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardfront"]
forState:UIControlStateNormal];
[sender setTitle:@"A♣︎" forState:UIControlStateNormal];
}
_flipCount++;
NSLog(@"%i",_flipCount); //
// self.flipCount++;
}
flipLable 数字不会添加,但没问题 app.But 我用自己更改了代码,它有效:
#import "YSHViewController.h"
@interface YSHViewController ()
@property (weak, nonatomic) IBOutlet UILabel *flipsLable;
@property (nonatomic) int flipCount;
@end
@implementation YSHViewController
- (void)setFlipCount:(int)flipCount
{
// _flipCount = flipCount;
// _flipsLable.text =[NSString stringWithFormat:@"Flips: %d",_flipCount]; // not working
// NSLog(@"%@", _flipsLable.text);
// NSLog(@"%@", self.flipsLable.text);
_flipCount = flipCount;
self.flipsLable.text = [NSString stringWithFormat:@"Flips: %d",self.flipCount];
}
- (IBAction)touchCardButton:(UIButton *)sender {
//if (sender.currentTitle.length != 0) {
if ([sender.currentTitle length]) {
//UIImage *cardImage = [UIImage imageNamed:@"cardback"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardback"]
forState:UIControlStateNormal];
[sender setTitle:@"" forState:UIControlStateNormal];
} else {
//UIImage *cardImage = [UIImage imageNamed:@"cardfront"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardfront"]
forState:UIControlStateNormal];
[sender setTitle:@"A♣︎" forState:UIControlStateNormal];
}
// _flipCount++;
// NSLog(@"%i",_flipCount); //
self.flipCount++;
}
那么,设置fliCount个数的两个变量有什么区别呢
这一行是它不起作用的原因:_flipCount++;
。
self.flipCount
是一个 属性。 _flipCount
是一个实例变量,其中默认存储 属性 值。当你写 self.flipCount
时,你实质上是为这个 属性 调用了一个 getter:[self flipCount]
。当你写 self.flipCount++;
时,你调用一个 getter,然后调用一个 setter。很粗略的可以这样写:
[self setFlipCount:[self flipCount] + 1];
您的自定义 setter 被调用。但是,当你写 _flipCount++
时,你直接访问了实例变量,所以你自定义的 setter 被忽略了。这就是为什么你的 flipLable
在第一种情况下没有更新。
看看这里:iOS setters and getters and underscored property names (SO question)
请注意,通常您应该使用 getters 和 setters(即 self.flipCount
)而不是实例变量来访问您想要的数据,即使您有一个直接访问实例变量,因为 getters/setters 可能会实现某些特定行为。例如,延迟初始化,或者像您的情况一样,UI 更新。
您通常只在 getters/setters 以及 init
和 dealloc
方法中使用实例变量(即 _flipCount
)(Apple 建议使用实例变量那里,因为自定义 getters/setters 可能会做一些不可预测的事情,如果对象还没有完全初始化,或者已经部分销毁,它也可能引发与 KVO 相关的问题。
我正在开发斯坦福大学的演示应用程序 ios7,问题如下:
#import "YSHViewController.h"
@interface YSHViewController ()
@property (weak, nonatomic) IBOutlet UILabel *flipsLable;
@property (nonatomic) int flipCount;
@end
@implementation YSHViewController
- (void)setFlipCount:(int)flipCount
{
_flipCount = flipCount;
_flipsLable.text =[NSString stringWithFormat:@"Flips: %d",_flipCount]; // not working
NSLog(@"%@", _flipsLable.text);
NSLog(@"%@", self.flipsLable.text);
self.flipsLable.text = [NSString stringWithFormat:@"Flips: %d",_flipCount];
}
- (IBAction)touchCardButton:(UIButton *)sender {
//if (sender.currentTitle.length != 0) {
if ([sender.currentTitle length]) {
//UIImage *cardImage = [UIImage imageNamed:@"cardback"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardback"]
forState:UIControlStateNormal];
[sender setTitle:@"" forState:UIControlStateNormal];
} else {
//UIImage *cardImage = [UIImage imageNamed:@"cardfront"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardfront"]
forState:UIControlStateNormal];
[sender setTitle:@"A♣︎" forState:UIControlStateNormal];
}
_flipCount++;
NSLog(@"%i",_flipCount); //
// self.flipCount++;
}
flipLable 数字不会添加,但没问题 app.But 我用自己更改了代码,它有效:
#import "YSHViewController.h"
@interface YSHViewController ()
@property (weak, nonatomic) IBOutlet UILabel *flipsLable;
@property (nonatomic) int flipCount;
@end
@implementation YSHViewController
- (void)setFlipCount:(int)flipCount
{
// _flipCount = flipCount;
// _flipsLable.text =[NSString stringWithFormat:@"Flips: %d",_flipCount]; // not working
// NSLog(@"%@", _flipsLable.text);
// NSLog(@"%@", self.flipsLable.text);
_flipCount = flipCount;
self.flipsLable.text = [NSString stringWithFormat:@"Flips: %d",self.flipCount];
}
- (IBAction)touchCardButton:(UIButton *)sender {
//if (sender.currentTitle.length != 0) {
if ([sender.currentTitle length]) {
//UIImage *cardImage = [UIImage imageNamed:@"cardback"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardback"]
forState:UIControlStateNormal];
[sender setTitle:@"" forState:UIControlStateNormal];
} else {
//UIImage *cardImage = [UIImage imageNamed:@"cardfront"];
[sender setBackgroundImage:[UIImage imageNamed:@"cardfront"]
forState:UIControlStateNormal];
[sender setTitle:@"A♣︎" forState:UIControlStateNormal];
}
// _flipCount++;
// NSLog(@"%i",_flipCount); //
self.flipCount++;
}
那么,设置fliCount个数的两个变量有什么区别呢
这一行是它不起作用的原因:_flipCount++;
。
self.flipCount
是一个 属性。 _flipCount
是一个实例变量,其中默认存储 属性 值。当你写 self.flipCount
时,你实质上是为这个 属性 调用了一个 getter:[self flipCount]
。当你写 self.flipCount++;
时,你调用一个 getter,然后调用一个 setter。很粗略的可以这样写:
[self setFlipCount:[self flipCount] + 1];
您的自定义 setter 被调用。但是,当你写 _flipCount++
时,你直接访问了实例变量,所以你自定义的 setter 被忽略了。这就是为什么你的 flipLable
在第一种情况下没有更新。
看看这里:iOS setters and getters and underscored property names (SO question)
请注意,通常您应该使用 getters 和 setters(即 self.flipCount
)而不是实例变量来访问您想要的数据,即使您有一个直接访问实例变量,因为 getters/setters 可能会实现某些特定行为。例如,延迟初始化,或者像您的情况一样,UI 更新。
您通常只在 getters/setters 以及 init
和 dealloc
方法中使用实例变量(即 _flipCount
)(Apple 建议使用实例变量那里,因为自定义 getters/setters 可能会做一些不可预测的事情,如果对象还没有完全初始化,或者已经部分销毁,它也可能引发与 KVO 相关的问题。