我发现在更新状态时,我在iPhone上随机得到一个EXC_BAD_ACCESS错误。这完全是随机发生的。
有谁知道怎么解决这个问题吗?
#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发布于 2009-02-12 01:24:39
你有一些漏洞(twitterEngine (当alloc/init做得很好的时候你会保留它)和arrayEmotes (永远不会被释放),并且当你发送更新时,你可能会有另一个与sImageName相关的问题(注意它不是在一个作用域中定义的,而不是在switch语句中-我真的不知道这是否真的会造成问题,这是我总是试图避免的。我可以看到它可能会导致EXC_BAD_ACCESS)。
无论如何,请尝试使用GDB逐步检查您的程序,以找出哪个对象正在提前发布。许多令人头疼的问题只需使用GDB即可解决。
发布于 2009-02-12 00:53:47
任何时候你有一个EXC_BAD_ACCESS错误,它总是一个保留/释放问题。你的代码也至少有一个漏洞(看看你在哪里创建了twitterengine)。
我建议你读一下Cocoa Memory Management Rules。他们会帮你找到问题所在。
发布于 2009-08-27 04:34:21
我也有这个问题,而且很奇怪;即使我正确地清理了我的MGTwitterEngine对象,但在我释放该对象后,它的一个回调函数仍然被调用。当回调以某种方式从死人中调用时,这会导致某种访问冲突。
https://stackoverflow.com/questions/539500
复制相似问题