2012-08-24 92 views
0

我写了下面的代码然后运行。 之后,当我触摸uibutton时,此应用程序终止。为什么这段代码被终止?

我想知道为什么终止。

我怀疑是否autorelease?

是否有任何人谁可以明确地解释

为什么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 
+0

这绝对是** **不是一个理由,为什么你的程序终止,但你应该改变'UIControlStateNormal&UIControlStateHighlighted&UIControlStateSelected'使用'OR's取代'AND's。 – dasblinkenlight

回答

0

看来,由于

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

MyClass的实例,当你触摸的按钮已经被释放。不要偷懒 - 自动释放是最终“解决我的内存管理问题,让我没有想到的解决方案 - 在这里你需要使用刚刚

myClass = [[MyClass alloc] init]; 

需要的时候再手动松开 - 可能在你的ViewController类的-dealloc方法中。

+0

为什么myClass会释放? myClass实例遇到了main.m的@autoreleasepool? –

+0

@ user1182731未知原因 - 这是实现定义的,可能在viewDidLoad的作用域退出时解除分配。 (只有当你阅读文档... UIApplicationMain永远不会返回,所以它根本不能击中主要的自动释放池...) – 2012-08-24 21:13:51

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

可能是因为你自动释放myClass。这是一个实例变量,所以应该保留(然后在该类的dealloc方法中发布)。

+0

在MyClass这样的自定义类中使用autorelease是不可能的? –

+0

autorelease可以用在什么情况下? –

+0

因为它是一个自动释放的对象,所以无法预测它何时会被释放。理想情况下,成员变量不应该被自动释放,因为我们将在代码的其他部分引用它们。所以最好为成员变量提供一个保留属性。 –

0

这是导致问题的autorelease。

你应该让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]; 
    }