首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MGTwitterEngine -状态更新

MGTwitterEngine -状态更新
EN

Stack Overflow用户
提问于 2009-02-12 00:25:27
回答 3查看 2.8K关注 0票数 0

我发现在更新状态时,我在iPhone上随机得到一个EXC_BAD_ACCESS错误。这完全是随机发生的。

有谁知道怎么解决这个问题吗?

代码语言:javascript
复制
#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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-12 01:24:39

你有一些漏洞(twitterEngine (当alloc/init做得很好的时候你会保留它)和arrayEmotes (永远不会被释放),并且当你发送更新时,你可能会有另一个与sImageName相关的问题(注意它不是在一个作用域中定义的,而不是在switch语句中-我真的不知道这是否真的会造成问题,这是我总是试图避免的。我可以看到它可能会导致EXC_BAD_ACCESS)。

无论如何,请尝试使用GDB逐步检查您的程序,以找出哪个对象正在提前发布。许多令人头疼的问题只需使用GDB即可解决。

票数 2
EN

Stack Overflow用户

发布于 2009-02-12 00:53:47

任何时候你有一个EXC_BAD_ACCESS错误,它总是一个保留/释放问题。你的代码也至少有一个漏洞(看看你在哪里创建了twitterengine)。

我建议你读一下Cocoa Memory Management Rules。他们会帮你找到问题所在。

票数 0
EN

Stack Overflow用户

发布于 2009-08-27 04:34:21

我也有这个问题,而且很奇怪;即使我正确地清理了我的MGTwitterEngine对象,但在我释放该对象后,它的一个回调函数仍然被调用。当回调以某种方式从死人中调用时,这会导致某种访问冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/539500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档