web-dev-qa-db-ja.com

ゲッターでCGRectがnullかどうかを確認します

プロパティゲッターでCGRectnullであるかどうかを確認しようとしています。そうである場合、デフォルトで値をロードしますが、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;
}

何が起こっているのか、どこを見ればよいのかわかりません。どんな助けでも大歓迎です。

25
crizzwald

クラスのインスタンスを作成すると、initメソッドが呼び出される前でも、__frame_インスタンス変数が自動的に初期化されます。 __frame_はC構造体(CGRect)であるため、そのメモリはすべてゼロにクリアされます。これにより、すべてゼロの値を持つCGRectが生成されます。

CGRectNullは、ゼロ以外の特別なCGRectです。したがって、CGRectIsNull()を使用したチェックは決して真にはなりません。

これを確認するには、CGRectIsEmptyを使用する方が適切です。

53
rmaddy

試す

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

    return _frame;
}
11
Anupdas

Swift 4.の更新された回答です。CGRectのisNullブールプロパティを使用するだけで、CGRectNullを確認できます。

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