Question

I am trying to check if a CGRect is null in my property getter and if it is, load a value by default, however, in my init method, when I use the property, it returns zero for all values.

Here is my getter:

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

I am not sure what's going on and where to look. Any help is much appreciated.

Was it helpful?

Solution

When you create an instance of your class, the _frame instance variable is automatically initialized, even before the init method is called. Since _frame is a C-struct (CGRect), its memory is cleared to all zeroes. This results in a CGRect with all zero values.

CGRectNull is a special, non-zero CGRect. So your check using CGRectIsNull() will never be true.

Using CGRectIsEmpty is a more proper check for this.

OTHER TIPS

Try

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

    return _frame;
}

Here is an updated answer for Swift 4. You are able to simply use CGRect's isNull boolean property to check for CGRectNull now:

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

Firstly, one needs to understand that a null rectangle and a rectangle which have zero width and height is different.

In Swift 5.0 and above-

To check whether a rectangle is null or not - use the isNull property on the rectangle. Let's say the rectangle variable's identifier is 'myFrame'. Then do following-

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

And for a rectangle of .zero(width = 0, height = 0) frame, check in following way -

if !myFrame.isEmpty{
    // do sth is the frame has height or width
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top