2012-08-25 44 views
0

所以我是新的iOS開發,我試圖委託按鈕點擊事件到另一個類。每當我點擊警報上的按鈕時,應用程序崩潰,我收到一個錯誤,說Thread_1 EXC_BAD_ACCESS。將UIAlertView委派給另一個類/文件?不工作?

這是我的代碼。

// theDelegateTester.h 
#import <UIKit/UIKit.h> 

@interface theDelegateTester : UIResponder <UIAlertViewDelegate> 
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; 
@end 

實現..

// theDelegateTester.m 
#import "theDelegateTester.h" 

@implementation theDelegateTester 
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog(@"Delegated"); 
} 
@end 

下面是我的視圖文件執行..

#import "appleTutorialViewController.h" 
#import "theDelegateTester.h" 

@interface appleTutorialViewController() 
- (IBAction)tapReceived:(id)sender; 
@end 

@implementation appleTutorialViewController 

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

- (void)viewDidUnload 
{ 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 



- (IBAction)tapReceived:(id)sender { 
    theDelegateTester *newTester = [[theDelegateTester alloc] init]; 
    UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"This is a delegated alert" delegate:newTester cancelButtonTitle:@"Close" otherButtonTitles:@"Cool!", nil]; 
    [myAlert show]; 
} 
@end 

回答

1

首先,你應該總是以一個大寫字母開頭的類名,所以您可以輕鬆區分類和實例或方法。

而你可能泄漏委託類。您應該在您的視圖控制器中聲明強大/保留的屬性TheDelegateTester *myDelegate。然後在tapReceived:是這樣的:

- (IBAction)tapReceived:(id)sender { 
    if (!self.myDelegate) { 
     TheDelegateTester *del = [[TheDelegateTester alloc] init]; 
     self.myDelegate = del; 
     [del release]; 
    } 
    UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"This is a delegated alert" delegate:newTester cancelButtonTitle:@"Close" otherButtonTitles:@"Cool!", nil]; 
    [myAlert show]; 
    [myAlert release]; 
} 
+0

嗯,是啊,這似乎做,但是那爲什麼我不能只是tapReceived內創建一個對象,並把它作爲委託參數?我必須將其傳遞給財產嗎?另外,當我調用del或myAlert的發佈時,我的項目也使用自動引用計數(ARC),並且不允許我發佈。據我所知,ARC基本上是自動垃圾收集,並釋放一個對象,當它不再看到它的用途? –

+0

如果您不創建屬性,則TheDelegateTester的實例將簡單地超出範圍並從內存中移除。如果您將其設爲財產,那麼該財產將確保它不會從內存中移除。關於你的第二個問題:是的。這不完全相同,但您不必擔心(不應該)擔心ARC的保留/發佈。 –

+0

問題是,代表通常很弱(非保留)參考。這意味着你(視圖控制器)負責保持對TheDelegateTester實例的引用。而這正是你不做的。 – DrummerB

相關問題