Ios 是否可以在不调用getter的情况下检查属性是否为nil?
我有一个Ios 是否可以在不调用getter的情况下检查属性是否为nil?,ios,objective-c,properties,getter,null,Ios,Objective C,Properties,Getter,Null,我有一个UILabel属性,它通常是nil,但我对它进行了编码,这样当我使用它时,如果它是nil,它将被初始化并准备通过getter使用。但是,我创建了一个bug,因为当我检查此属性是否为nil,它会初始化它,使其不再为nil 是否可以在不调用其getter方法的情况下找出属性是否为nil if (self.myLabel) { //run code when this property already is initialized, but don't if it is nil }
UILabel
属性,它通常是nil
,但我对它进行了编码,这样当我使用它时,如果它是nil
,它将被初始化并准备通过getter使用。但是,我创建了一个bug,因为当我检查此属性是否为nil
,它会初始化它,使其不再为nil
是否可以在不调用其getter方法的情况下找出属性是否为nil
if (self.myLabel) {
//run code when this property already is initialized, but don't if it is nil
}
//Getter:
- (UILabel *)myLabel {
if (!_myLabel) {
_myLabel = [UILabel alloc] init...
}
}
您唯一的选择是更改:
if (self.myLabel) {
致:
更新内容如下:
使用call
\u myLabel
将允许您在不调用getter的情况下访问变量。然而,虽然下划线是一种标准约定,但它不是必需的,通过简单地调用变量,您也可以直接访问内部变量。一种方法是提供一个单独的BOOL
属性,告诉调用者\u myLabel
变量是否为nil
:
@property (nonatomic, readonly) BOOL isLabelSet;
...
-(BOOL)isLabelSet {
return _myLabel != nil;
}
假设您拥有该类的源代码,还可以通过显式声明烘焙变量并将其标记为
@public
,来启用对烘焙变量的直接访问,但这样做会破坏封装。您回答了自己的问题。看看你的getter是如何做到的。如果你不介意作弊的话,你甚至可以从不同的类访问ivar。(当然,如果ivar名称发生变化,你会被烧死。)仅供参考——它与“语法”无关。这只是一个直接访问ivar的问题,ivar可能用下划线命名,也可能不用下划线命名。你确定吗?我的印象是,在objective-C中,下划线是直接访问内部变量的定义。如果不是这样的话,您如何在没有下划线的情况下访问变量?我100%确定。下划线只是一种标准命名约定,但不是必需的。无论是否使用下划线命名,访问ivar的方式都完全相同。
@property (nonatomic, readonly) BOOL isLabelSet;
...
-(BOOL)isLabelSet {
return _myLabel != nil;
}