Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以在不调用getter的情况下检查属性是否为nil?_Ios_Objective C_Properties_Getter_Null - Fatal编程技术网

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;
}