2009-02-12 2 views
0

Я обнаружил, что случайным образом я получаю ошибку EXC_BAD_ACCESS на iPhone при обновлении статуса. Это происходит довольно случайно.MGTwitterEngine - Обновления статуса

У кого-нибудь есть идея, как это сделать?

#import "TwitterViewController.h" 

NSString *_testUID = nil; 
NSString *sImageName; 

@implementation TwitterViewController 

//Turns NSLogs into comments 
//#define NSLog // 

- (void)viewDidLoad { 

    self.title = @"Twitter"; 

    arrayEmotes = [[NSMutableArray alloc] init]; 
    [arrayEmotes addObject:@"Happy"]; 
    [arrayEmotes addObject:@"Sad"]; 
    [arrayEmotes addObject:@"Tongue"]; 
    [arrayEmotes addObject:@"Drunk"]; 
    [arrayEmotes addObject:@"Bored"]; 
    [arrayEmotes addObject:@"Love"]; 
    [arrayEmotes addObject:@"Sleepy"]; 
    [arrayEmotes addObject:@"Sick"]; 
    [arrayEmotes addObject:@"Awake"]; 
    [arrayEmotes addObject:@"Shocked"]; 
    [arrayEmotes addObject:@"Angry"]; 
    [arrayEmotes addObject:@"Laughing"]; 
    [arrayEmotes addObject:@"Dancing"]; 
    [arrayEmotes addObject:@"Confused"]; 

    [activityView startAnimating]; 
    [currentActivity setText:@"Logging In"]; 

    NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"username_preference"]; 
    NSString *password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password_preference"]; 

    // Make sure you entered your login details before running this code... ;) 
    if ([username isEqualToString:@""] || [password isEqualToString:@""]) { 
     //Show the UIAlert if no username or password is stored in the settings 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Incorrect username/password stored in the settings." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release];   
     NSLog(@"You forgot to specify your username/password in settings.bundle!"); 
    } 

    // Create a TwitterEngine and set our login details. 
    twitterEngine = [[[MGTwitterEngine alloc] initWithDelegate:self] retain]; 
    [twitterEngine setUsername:username password:password]; 

    // Get updates from people the authenticated user follows. 
    //[twitterEngine getFollowedTimelineFor:username since:nil startingAtPage:0]; 
    _testUID = [twitterEngine testService]; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { 
    return 1; 
} 


- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { 
    return [arrayEmotes count]; 
} 

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [arrayEmotes objectAtIndex:row]; 
} 

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    NSLog(@"Selected Color: %@. Index of selected color: %i", [arrayEmotes objectAtIndex:row], row); 
    [btnUpdateMood setEnabled:YES]; 
} 

- (IBAction)updateMood:(id)sender 
{ 

    NSLog(@"Tried to send status."); 

    NSInteger selectedindex = [pickerView selectedRowInComponent:0]; 
    switch(selectedindex){ 
     case 0: 
      //Happy 
      sImageName = @"Happy"; 
      break; 
     case 1: 
      //Sad 
      sImageName = @"Sad"; 
      break; 
     case 2: 
      //Tongue 
      sImageName = @"Tounge"; 
      break; 
     case 3: 
      //Drunk 
      sImageName = @"Drunk"; 
      break; 
     case 4: 
      //Bored 
      sImageName = @"Bored"; 
      break; 
     case 5: 
      //Love 
      sImageName = @"Love"; 
      break; 
     case 6: 
      //Sleepy 
      sImageName = @"Sleepy"; 
      break; 
     case 7: 
      //Sick 
      sImageName = @"Sick"; 
      break; 
     case 8: 
      //Awake 
      sImageName = @"Awake"; 
      break; 
     case 9: 
      //Shocked 
      sImageName = @"Shocked"; 
      break; 
     case 10: 
      //Angry 
      sImageName = @"Angry";   
      break; 
     case 11: 
      //Laughing 
      sImageName = @"Laughing";   
      break; 
     case 12: 
      //Dancing 
      sImageName = @"Dancing"; 
      break; 
     case 13: 
      //Confused 
      sImageName = @"Confused"; 
      break; 
     default: break; 
    } 

    [twitterEngine sendUpdate:[@"has changed his/her iMood to " stringByAppendingString:sImageName]]; 

} 


// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 


- (void)dealloc { 
    //Releasing seems to sometimes cause complete errors. 
    //[twitterEngine release]; 
    [super dealloc]; 
} 

#pragma mark MGTwitterEngineDelegate methods 


- (void)requestSucceeded:(NSString *)requestIdentifier 
{ 
    [activityView stopAnimating]; 

    //Some animations 
    [UIView beginAnimations:@"redToWhite" context:nil]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationRepeatCount:0]; 

    //Change background colour of the activity area over 1 second 
    [activityArea setBackgroundColor:[UIColor whiteColor]]; 
    [currentActivity setText:@"Logged In"]; 

    [UIView commitAnimations]; 
    //End of animations 

    NSLog(@"Request succeeded (%@)", requestIdentifier); 

    if ([requestIdentifier isEqualToString:_testUID]) 
    { 
     NSLog(@"[TWITTER UP]"); 
    } 

} 


- (void)requestFailed:(NSString *)requestIdentifier withError:(NSError *)error 
{ 

    currentActivity.text = [NSString stringWithFormat:@"Error: %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]]; 
    NSLog(@"Twitter request failed! (%@) Error: %@ (%@)", 
      requestIdentifier, 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 

} 


- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)identifier 
{ 
    NSLog(@"Got statuses:\r%@", statuses); 
} 


- (void)directMessagesReceived:(NSArray *)messages forRequest:(NSString *)identifier 
{ 

    NSLog(@"Got direct messages:\r%@", messages); 
} 


- (void)userInfoReceived:(NSArray *)userInfo forRequest:(NSString *)identifier 
{ 
    NSLog(@"Got user info:\r%@", userInfo); 
} 


- (void)miscInfoReceived:(NSArray *)miscInfo forRequest:(NSString *)identifier 
{ 
    NSLog(@"Got misc info:\r%@", miscInfo); 
} 


- (void)imageReceived:(UIImage *)image forRequest:(NSString *)identifier 
{ 
    NSLog(@"Got an image: %@", image); 
} 




@end 
+0

Можете ли вы предоставить обратную линию? – codelogic

ответ

2

У вас есть несколько утечек (twitterEngine (вы сохраняете его, когда alloc/init выполняет работу отлично) и arrayEmotes (никогда не освобождается), чтобы назвать сразу два обнаруженных мною), и у вас может быть другая проблема, связанная с sImageName при отправке обновления (обратите внимание на то, как он не определен в области, отличной от внутри оператора switch, - я действительно не знаю, действительно ли это вызовет проблемы, это просто то, что я всегда стараюсь избегать. потенциально вызывающий EXC_BAD_ACCESS).

В любом случае, попробуйте использовать GDB, чтобы выполнить свою программу, чтобы выяснить, какой именно объект выпускается раньше. Много головных болей можно решить просто с помощью GDB.

0

В любое время, когда у вас есть ошибка EXC_BAD_ACCESS, это всегда проблема сохранения/выпуска. У вашего кода также есть хотя бы одна утечка (посмотрите, где вы создаете твитергинг).

Предлагаю вам прочитать Cocoa Memory Management Rules. Они помогут вам найти проблему.

0

У меня тоже есть эта проблема, и это странно; хотя я правильно очищаю свой объект MGTwitterEngine, один из его обратных вызовов по-прежнему вызывает вызов после того, как я освобожу объект. Это вызывает какое-то нарушение прав доступа, когда обратный вызов каким-то образом вызывается из мертвых.

+0

[twitter closeAllConnections] может работать? – Domness

Смежные вопросы