0

我已经编写了以下代码然后运行。之后,当我触摸 uibutton 时,该应用程序被终止。

我想知道为什么终止。

我怀疑是否自动释放?

有没有人可以明确解释

为什么 myClass 实例被释放和

myClass 被释放的地方和

myClass 可以使用自动释放的方式?

    @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 回答