0

これを構築するときに、deallocで「baseView」宣言されていないエラーが発生するのはなぜか疑問に思っています。

CGRect baseFrame = CGRectMake(0, 0, 320, 480);
UIView *baseView = [[UIView alloc] initWithFrame:baseFrame];
self.view = baseView;

- (void)dealloc {
[baseView release];
[super dealloc];

}

allocを使用してビューを作成しましたが、baseViewを解放しようとしたときにエラーが発生する理由がわかりません。(viewDidUnloadでnilに設定しようとすると、同じエラーが発生します。

4

4 に答える 4

2

「baseView」は.hファイルで宣言されていないので、私の推測です。ポインタは、それが宣言されているメソッドのライフサイクルにのみ存在します。

これは次のように修正できます。

CGRect baseFrame = CGRectMake(0, 0, 320, 480);
UIView *baseView = [[UIView alloc] initWithFrame:baseFrame];
[self.view addSubview:baseView];
[baseView release];

ビューはbaseViewを保持するため、ここでリリースできます。次に、の参照を削除しますdealloc

于 2011-03-17T03:35:45.220 に答える
1

ポインターは、baseView作成するメソッドでローカルに宣言されます。baseView他のメソッドでも操作する必要がある場合は、インスタンス変数としてポインターを追加することをお勧めします。

// MyClass.h
@interface MyClass {
    UIView *baseView; // declare as an instance variable;
}

@end

// MyClass.m
#import "MyClass.h"

@implementation MyClass

- (void)someMethod {
    baseView = [[UIView alloc] initWithFrame:..];
}

- (void)someOtherMethod {
    // baseView is accessible here
}

- (void)yetAnotherMethod {
    // baseView is accessible here too
}

@end
于 2011-03-17T03:38:07.103 に答える
0

で使用してみてください

[self.view addSubView:baseView];
[baseView release];

Deallocから解放する場合は、.hファイルで宣言する必要があります

于 2011-03-17T03:36:18.683 に答える
0

baseViewはローカル変数として宣言されており、既知であるか、宣言されているメソッドによってのみアクセスできます。クラスの他のメソッドからアクセスする必要baseViewがある場合は、インスタンス変数として宣言されていることを確認してください。

于 2011-03-17T04:28:18.377 に答える