0

私は次のコードを書いて実行しました。その後、uibutton をタッチすると、このアプリが終了します。

終了した理由が知りたいです。

自動解放かどうか疑問に思いますか?

明確に説明できる人はいますか

myClass インスタンスが解放される理由と

myClass がリリースされる場所と

myClass が autorelease を使用できる方法は?

    @interface MyClass : NSObject
    - (void)testMethod;
    @end

    @implementation MyClass{
        NSMutableArray *array;
    }

    - (id)init{
        if ((self = [super init])) {
            array = [[NSMutableArray alloc] initWithCapacity:0];
        }
        return self;
    }

    - (void)dealloc {
        [array release];
        [super dealloc];
    }

    - (void)testMethod {
        NSLog(@"after init : %@", array);
    }

    @end

    @implementation ViewController {
        MyClass *myClass;
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        myClass = [[[MyClass alloc] init] autorelease];  <== cause of ternimate?

        UIButton *aButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton addTarget:self action:@selector(testArray:) forControlEvents:UIControlEventTouchUpInside];
        aButton.frame=CGRectMake(110.0f, 129.0f, 100.0f, 57.0f);
        [aButton setTitle:@"title" forState:UIControlStateNormal & UIControlStateHighlighted & UIControlStateSelected];
        [self.view addSubview:aButton];

    }

    - (void)testArray:(id)sender {
        [myClass testMethod];
    }
@end
4

3 に答える 3

1
myClass = [[[MyClass alloc] init] autorelease];

おそらくあなたが自動解放しているためですmyClass。これはインスタンス変数であるため、保持する必要があります (その後、クラスのdeallocメソッドで解放します)。

于 2012-08-24T20:43:51.113 に答える
0

どうやら

myClass = [[[MyClass alloc] init] autorelease];

ボタンをタッチすると、 MyClass のインスタンスは既に割り当て解除されています。怠惰にならないでください - 自動解放は究極の「メモリ管理の問題を解決し、考える必要をなくす」ソリューションではありません - ここでは、単に使用する必要があります

myClass = [[MyClass alloc] init];

その後、必要に応じて手動で解放します - おそらく ViewController クラスの -dealloc メソッドで。

于 2012-08-24T20:44:35.457 に答える
0

問題を引き起こしているのは自動リリースです。

myClass をプロパティにする必要があります。

@implementation ViewController {

    }
    @property (nonatomic, retain) MyClass *myClass;

    @synthesize myClass
    -(void)dealloc
    {
      [myClass release];
      [super dealloc];
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        self.myClass = [[[MyClass alloc] init] autorelease];

        UIButton *aButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton addTarget:self action:@selector(testArray:) forControlEvents:UIControlEventTouchUpInside];
        aButton.frame=CGRectMake(110.0f, 129.0f, 100.0f, 57.0f);
        [aButton setTitle:@"title" forState:UIControlStateNormal & UIControlStateHighlighted & UIControlStateSelected];
        [self.view addSubview:aButton];

    }

    - (void)testArray:(id)sender {
        [myClass testMethod];
    }
于 2012-08-24T20:45:16.543 に答える