检查getter中的CGRect是否为null

时间:2013-04-18 16:48:11

标签: ios ios6 null cgrect cgrectmake

我正在尝试检查我的属性getter中CGRect是否为null,如果是,则默认加载一个值,但是,在我的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 个答案:

答案 0 :(得分:52)

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

CGRectNull是一个特殊的非零CGRect。因此,使用CGRectIsNull()进行检查将永远不会成立。

使用CGRectIsEmpty对此进行更合理的检查。

答案 1 :(得分:10)

尝试

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

    return _frame;
}

答案 2 :(得分:1)

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

let someRect = CGRect.null
print(someRect.isNull) // true

答案 3 :(得分:0)

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

在Swift 5.0及更高版本中-

要检查矩形是否为空-在矩形上使用WITH ord AS (SELECT t1.VehicleId, t1.EventTimestamp AS first, t2.EventTimestamp AS last, t1.EventId, t2.EventValue, ROW_NUMBER() OVER (PARTITION BY t1.VehicleId, t1.EventTimestamp, t1.EventId ORDER BY t1.EventTimestamp) AS rn FROM #T1 AS t1 LEFT JOIN #T2 AS t2 ON t1.VehicleID = t2.VehicleID AND t1.EventID = t2.EventID AND t2.EventTimestamp > t1.EventTimestamp LEFT JOIN #E AS e ON t1.EventId = e.EventId AND t1.EventValue = e.FirstValue AND t2.eventId = e.EventId AND t2.EventValue = e.LastValue ) SELECT VehicleId, first, last, EventId, EventValue, DATEDIFF(second, first, last) AS EventDelay FROM ord WHERE rn = 1 属性。假设矩形变量的标识符为“ myFrame”。然后执行以下操作-

isNull

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

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