2012-08-24 131 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]; 
    }