多线程应用程序崩溃,日志说无法恢复以前选择的框架

时间:2011-07-04 12:55:41

标签: iphone multithreading

接口文件:

    // ...    

    UITextView *statusTextView_;
    UITableView *accountListTableView_;
    NSMutableArray *accountList_;

    NSString *lastStatus_;

    // ...

@property (retain) UITextView *statusTextView;
@property (retain) UITableView *accountListTableView;
@property (retain) NSMutableArray *accountList;

@property (retain) NSString *lastStatus;

// ...

实施档案:

// ...

@synthesize statusTextView=statusTextView_;
@synthesize accountListTableView=accountListTableView_;
@synthesize accountList=accountList_;

@synthesize lastStatus=lastStatus_;

- (void)aBtnTapAction:(id)sender
{
    [self.lastStatus release];
    NSString *buf = [[NSString alloc] initWithString:self.statusTextView.text];
    self.lastStatus = buf;
    [buf release];

    for (NSDictionary *dict in self.accountList) {
        if (TRUE == [[dict objectForKey:@"checked"] boolValue]) {
            NSString *selectorName = [[NSString alloc] initWithFormat:@"%@:", [dict objectForKey:@"name"]];
            SEL sel = NSSelectorFromString(selectorName);
            [selectorName release];
            if (YES == [self respondsToSelector:sel]) {
                [self performSelectorInBackground:sel withObject:dict];                
            }
        }
    }
}

selectorName是以下之一

- (void)sina:(NSDictionary *)info
{    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    SinaController *sina = [[FooController alloc] 
                                 initWithUsername:[info objectForKey:@"username"]
                                 andPasswd:[info objectForKey:@"passwd"]];
    code = [sina post:self.lastStatus];    
    [sina release]; 

    [pool release];     
}

- (void)qq:(NSDictionary *)info
{    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    QQController *qq = [[FooController alloc] 
                                 initWithUsername:[info objectForKey:@"username"]
                                 andPasswd:[info objectForKey:@"passwd"]];
    code = [qq post:self.lastStatus];    
    [qq release]; 

    [pool release];     
}

应用程序总是在qq或sina线程中崩溃,日志说:

warning: check_safe_call: could not restore current frame
warning: Unable to restore previously selected frame.

测试环境:MacOS10.6.7,XCode4&模拟器。

我无法通过XCode产品找到任何有用的信息 - >分析或简介 - >内存泄漏。 我正在关注内存管理编程指南,并尽力解决它,但它仍然崩溃。

  • 我的代码有什么问题,为什么会崩溃?
  • 编写多线程pragram时,Objective-C编码器的最佳实践是什么?

感谢您的回复。

1 个答案:

答案 0 :(得分:-1)

通过使用点符号释放,您过度释放。

[self.lastStatus release];

应该只是

self.lastStatus = nil;

否则,您在lastStatus上调用一个版本,然后在使用

分配新值时
self.lastStatus = buf;

然后,这是首先在已发布的对象上调用一个版本。有关更多信息,请阅读有关属性,点符号和内存管理的信息。