下面是我的代码包含一个线程。此线程照顾队列大小,如果大小> 10,然后记录并删除最后一个对象。但是当我运行demo = [[myDemo alloc] init]启动线程,并获得异常消息=“EXC_BAD_ACCESS”。有没有人帮我解决这个问题?NSThread崩溃[EXC_BAD_ACCESS]
@interface myDemo:NSObject
{
NSMutableArray *q;
NSThread *thread;
bool running;
}
-(void)putData:(NSData *)data;
-(NSData *)popData;
-(void)stopThread;
@end;
@implementation myDemo
-(id)init
{
if(NULL!=(self = [super init]))
{
q=[NSMutableArray array];
thread=[[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[thread start];
}
return self;
}
-(void)myThreadMainMethod:(id)object
{
unsigned long count;
NSData *data;
if(running) return;
running=true;
while(running)
{
@synchronized(self)
{
count=[q count];//crash !!!!
if(count>10)
{
data=[q lastObject];
NSLog(@"count=%d ,remove last data=%@",count,[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
[q removeLastObject];
}
}
}
running=false;
}
putData和popData是由@synchronized(个体)访问队列
-(void)putData:(NSData *)data
{
@synchronized(self)
{
[q addObject:data];
}
}
-(NSData *)popData
{
NSData * data=NULL;
unsigned long count;
@synchronized(self)
{
count=[q count];
if(count!=0)
{
data=[q lastObject];
[q removeLastObject];
}
}
return data;
}
如何声明'q'? –
你用ARC吗? –
@ Daij-Djan他没有看到“[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]” –