2013-06-27 183 views
-1

下面是我的代碼包含一個線程。此線程照顧隊列大小,如果大小> 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; 
} 
+0

如何聲明'q'? –

+0

你用ARC嗎? –

+0

@ Daij-Djan他沒有看到「[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]」 –

回答

1

嘗試初始化 「Q」 的ivar用1保持計數非自動釋放物體,像這樣:

- (id)init 
{ 
    if (self = [super init]) 
    { 
     q = [[NSMutableArray alloc] initWithCapacity:10]; 
     thread = [[NSThread alloc] initWithTarget:self 
             selector:@selector(myThreadMainMethod:) 
              object:nil]; 
     [thread start]; 
    } 
    return self; 
} 

此外,你必須把後臺線程上運行的所有代碼放入@autoreleasepoolNSAutoreleasePool。我認爲你的程序不知何故耗盡內存。例如:

- (void)myThreadMainMethod:(id)object 
{ 
    @autoreleasepool { 
     static unsigned long count; 
     NSData *data = nil; 
     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; 
     } 
    } 
} 

此外,您的班級中的ivars同步存在問題。 您正在同步self,但您在同步範圍之外使用「正在運行」。 此外,循環的邏輯不清楚,你只是運行循環一次,你爲什麼需要它?

+0

我測試你的建議,但崩潰仍然 – luckfox0927

+0

@ luckfox0927我已編輯我的答案,檢查出 –

+0

感謝您的幫助!這個標誌「運行」應該是「while循環」。 – luckfox0927

1

AFAIK [NSArray array]返回一個自動釋放對象。雖然我只是沒有找到一個參考。我認爲你應該在init方法中保留它,因爲你不需要ARC。

0

我重寫線程代碼below.thread是後死機 「while循環」 跑564次

-(void)myThreadMainMethod:(id)object 
    { 
     unsigned long count,index=0; 
     NSData *data; 
     NSMutableArray *q1; 
     if(running) return; 
     running=true; 

     q1=[NSMutableArray array]; 
     while(running) 
     { 
      @synchronized(self) 
      { 

       count=[q count];//crash !!! 
       NSLog(@"#%d count=%d ",index++,count); 

      } 
     } 
    } 

然後我再次如下

-(void)myThreadMainMethod:(id)object 
    { 
     unsigned long count,index=0; 
     NSData *data; 
     NSMutableArray *q1; 
     if(running) return; 
     running=true; 

     q1=[NSMutableArray array]; 
     while(running) 
     { 
      @synchronized(self) 
      { 

       count=[q1 count];//run fine 
       NSLog(@"#%d count=%d ",index++,count);  
      } 
     } 
    } 

運行良好......爲什麼改寫?

+0

嘗試編輯您的原始問題,而不是在沒有實際答案的情況下爲自己的問題添加答案。 你的問題怎麼樣: 你正在以非常錯誤的方式管理線程。嘗試閱讀本指南:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html –

0

是不是因爲 NSMutableArray * q1;應該用作count = [q1 count];而不是count = [q count];因爲它被宣佈爲q1而不是q?

相關問題