25

我正在尝试检查 aCGRect是否null在我的属性 getter 中,如果是,则默认加载一个值,但是,在我的 init 方法中,当我使用该属性时,它对所有值都返回零。

这是我的吸气剂:

- (CGRect)frame
{
    if(CGRectIsNull(_frame))
        _frame = CGRectMake(0,0,60,60);
    return _frame;
}

- (id)init
{
    self = [super initWithFrame:self.frame];
    if(self)
    {
        //do something
    }
    return self;
}

我不确定发生了什么以及在哪里看。任何帮助深表感谢。

4

4 回答 4

55

当您创建类的实例时,即使在调用方法_frame之前,实例变量也会自动初始化。init由于_frame是一个 C-struct ( CGRect),它的内存被清零。这导致 aCGRect的值全为零。

CGRectNull是一个特殊的非零CGRect。所以你的支票使用CGRectIsNull()永远不会是真的。

使用CGRectIsEmpty是一个更合适的检查。

于 2013-04-18T16:55:50.033 回答
12

尝试

- (CGRect)frame
{
    if (CGRectIsEmpty(_frame)) 
    _frame = CGRectMake(0,0,60,60);

    return _frame;
}
于 2013-04-18T16:52:10.197 回答
2

这是 Swift 4 的更新答案。您现在可以简单地使用 CGRect 的isNull布尔属性来检查 CGRectNull:

let someRect = CGRect.null
print(someRect.isNull) // true
于 2018-02-06T20:09:49.080 回答
0

首先,需要了解空矩形和宽度和高度为零的矩形是不同的。

在 Swift 5.0 及更高版本中-

要检查矩形是否为空 - 使用isNull矩形上的属性。假设矩形变量的标识符是“myFrame”。然后执行以下操作 -

if !myFrame.isNull{
    //do sth if the frame is not nul
} 

对于 .zero(width = 0, height = 0) 框架的矩形,请按以下方式检查 -

if !myFrame.isEmpty{
    // do sth is the frame has height or width
}
于 2020-09-22T13:14:19.427 回答