接口文件:
// ...
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产品找到任何有用的信息 - >分析或简介 - >内存泄漏。 我正在关注内存管理编程指南,并尽力解决它,但它仍然崩溃。
感谢您的回复。
答案 0 :(得分:-1)
通过使用点符号释放,您过度释放。
[self.lastStatus release];
应该只是
self.lastStatus = nil;
否则,您在lastStatus上调用一个版本,然后在使用
分配新值时self.lastStatus = buf;
然后,这是首先在已发布的对象上调用一个版本。有关更多信息,请阅读有关属性,点符号和内存管理的信息。