0

我已经宣布了财产:

@property (weak, nonatomic) IBOutlet UILabel *statusLabel;

然后我像这样使用它: statusLabel.text = plainText; 或 [statusLabel setText plainText];

在这两种情况下,我都会收到编译器错误“使用未声明的标识符'statusLabel';你的意思是_statusLabel吗?”。实际上,当我用_statusLabel替换statusLabel时,编译器很高兴。

我完全不解。1.是的,XCode会自动合成_statusLabel,但是我尝试使用属性,而不是实例变量。为什么属性不可见?

  1. 据我了解,将 .(dot) 与 ivar 一起使用是错误的,点用于属性。为什么又来了?

  2. 如果我手动指定合成不带下划线的 var,则代码可以工作,但同样,这意味着编译器使用变量而不是属性。

所以,这个组合有效:@synthesize statusLabel = statusLabel; ... [statusLabel setText:plainText];

这不是:@synthesize statusLabel = _statusLabel; ... [statusLabel setText:plainText];

有人解释一下吗?非常感谢。哔叽

4

4 回答 4

1

如果你不合成一个变量,你只能通过它的自动合成的_variable属性或者self.variable来访问它。

否则你可以合成它。

把它当做是没有错的_statusLabel。没关系。您也可以使用self.statusLabel而不是_statusLabel

你可以在这里阅读@synthesize 的作用

于 2013-10-14T19:16:15.653 回答
1
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;

将生成一个名为 setStatusLabel 的 setter、一个 getter statusLabel 和一个 _statusLabel。不会有名为 statusLabel 的变量,当你使用 self 和“.”时 语法您实际上是在调用 setter/getter 而不是直接访问变量。例如,如果您需要覆盖属性的设置器,则需要直接使用该变量,这样您就不会创建不定式递归循环。

// NOTE: WRONG! recursive infinitive loop
- (void)setStatusLabel:(UILabel *)label
{
    self.statusLabel = label;
}

// RIGHT way (in regards to avoiding infinitive recursion)
- (void)setStatusLabel:(UILabel *)label
{
    _statusLabel = label;
}

self.statusLabel = @"";
[self setStatusLabel:[[UILabel alloc] init]];
_statusLabel = [[UILabel alloc] init];
UILabel *label = self.statusLabel;
UILabel *label = [self statusLabel];
UILabel *label = _statusLabel;

如果您决定合成您的属性,则可以覆盖变量名称:

@syntersize statusLabel = myVarName;

您可以像这样覆盖 setter/getter 名称:

@property (nonatomic, weak, setter = mySetter, get = myGet) IBOutlet UILabel *statusLabel;

此外,如果您决定像这样合成属性:@syntersize statusLabel; 生成的变量将没有“_”。

尽管我认为没有真正的理由更改 setter/getter 或变量名称的默认名称...

于 2013-10-14T19:42:47.863 回答
0

感谢您的解释,据我所知,这些是有效的访问方式(前 3 个用于财产,最后 2 个 - 直接 ivar):

[[self statusLabel] setText:plainText]; 
[self.statusLabel setText: plainText]; 
self.statusLabel.text = plainText; 

[_statusLabel setText:plainText]; 
_statusLabel.text = plainText;
于 2013-10-15T13:01:35.887 回答
0

如果您允许 xcode 自动合成该属性,那么您需要将其称为self.statuslabel.

于 2013-10-14T19:16:38.667 回答