2013-06-04 3 views
0

Я просмотрел все соответствующие сообщения на EXC_BAD_ACCESS, но пока не понял эту концепцию. Возможно, мне следует сначала изучить основные понятия, но сейчас мне нужно решить эту проблему. Итак, вмешался, чтобы получить некоторую экспертную помощь.Сохранять свойство и EXC_BAD_ACCESS на NSArray

Вот мой код (я вставил только соответствующую часть)

//In .h 
//===== 
     @interface GUIMainController : GUIController { 
     :: 
     :: 
      NSArray* shufflePositionArray; 
     } 

     @property (retain)NSArray* shufflePositionArray; 

//In .mm 
//======= 
     @synthesize shufflePositionArray; 

     -(void)start 
     { 
     :: 
      NSString* shufflePositionArrayPlistPath=nil; 
      NSString* shufflePositionArrayPlistPathFromConfiguration= 
      @"/MyApp/Configuration/ShufflePositionArray.plist"; 
      if ([[NSFileMngrdfltMngr]fileExistsAtPath:shufflePositionArrayPlistPathFromConfig]) 
      { 
      self.shufflePositionArray= 
        [NSArrayarrayWithContentsOfFile:shufflePositionArrayPlistPathFromConfig]; 
      } 
      if (self.shufflePositionArray==nil) { 
      shufflePositionArrayPlistPath= 
      [thisBundle pathForResource:@"ShufflePositionArray" ofType:@"plist"]; 

      if (shufflePositionArrayPlistPath!=nil) { 
        self.shufflePositionArray= 
          [NSArray arrayWithContentsOfFile:shufflePositionArrayPlistPath]; 
       } 
      } 
     } 

//From another method: 
//==================== 

     -(void)shuffleWindow 
     { 
     :: 
      if (shufflePositionArray!=nil && [self.shufflePositionArray count]!=0){ 
     :: // some code 
      if (shufflePositionArray!=nil && [self.shufflePositionArray count]!=0){ 
     :: 
     :: // some code 
      processwindowlocation_=(processwindowlocation_+1)%[self.shufflePositionArray count];  
       // ######## there is a crash here !!!!!! ############# 
      } 
     } 

     } 
//And then..we release it here: 
//============================== 
     -(void)dealloc { 

      if(shufflePositionArray!=nil){ 
       [shufflePositionArray release]; 
      } 
      [super dealloc]; 
     } 

Я совершенно не знаком с obj-C, любая помощь будет оценена. Спасибо заранее.

Вот авария:

Разбился Тема: 0 очереди отправки: com.apple.main-нить

Исключение Тип: EXC_BAD_ACCESS (SIGSEGV) Исключительные коды: KERN_INVALID_ADDRESS в 0x0000000000000018

В.М. Регионы Рядом 0x18: -> __TEXT 000000010d89a000-000000010d927000 [564K] ая/RWX SM = КОРОВА /Ihome/MyAppCE.app/Contents/MacOS/MyAppCE

Application Specific Информация: objc_msgSend() имя селектора: подсчитывать

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib     0x00007fff82c5d62f objc_msgSend_vtable9 + 47 
1 com.apple.AppKit    0x00007fff88842b05 +[NSScreen screens] + 847 
2 com.apple.AppKit    0x00007fff88844575 +[NSScreen _zeroScreenHeight] + 44 
3 com.apple.AppKit    0x00007fff888b15cf _NSShapeRoundedWindowWithWeighting + 61 
4 com.apple.AppKit    0x00007fff888507c3 -[NSThemeFrame shapeWindow] + 336 
5 com.apple.AppKit    0x00007fff888b055c -[NSThemeFrame setFrameSize:] + 457 
6 com.apple.AppKit    0x00007fff888af68f -[NSWindow _setFrame:updateBorderViewSize:] + 929 
7 com.apple.AppKit    0x00007fff888aee04 -[NSWindow _oldPlaceWindow:] + 1142 
8 com.apple.AppKit    0x00007fff888ae2b9 -[NSWindow _setFrameCommon:display:stashSize:] + 1837 
9 com.Apple.Phoenix.UI   0x0000000110580045 -[GUIMainController shuffleWindow] + 1477 (GUIMainController.mm:470) 
10 com.Apple.Phoenix.UI   0x0000000110586aef -[GUIPeriodicController periodic:] + 2399 (GUIPeriodicController.mm:219) 
11 com.apple.Foundation   0x00007fff86867463 __NSFireTimer + 96 
12 com.apple.CoreFoundation  0x00007fff81df5804 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 
13 com.apple.CoreFoundation  0x00007fff81df531d __CFRunLoopDoTimer + 557 
14 com.apple.CoreFoundation  0x00007fff81ddaad9 __CFRunLoopRun + 1529 
15 com.apple.CoreFoundation  0x00007fff81dda0e2 CFRunLoopRunSpecific + 290 
16 com.apple.HIToolbox    0x00007fff83dc6eb4 RunCurrentEventLoopInMode + 209 
17 com.apple.HIToolbox    0x00007fff83dc6b94 ReceiveNextEventCommon + 166 
18 com.apple.HIToolbox    0x00007fff83dc6ae3 BlockUntilNextEventMatchingListInMode + 62 
19 com.apple.AppKit    0x00007fff8887f533 _DPSNextEvent + 685 
20 com.apple.AppKit    0x00007fff8887edf2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128 
21 com.Apple.Phoenix.UI   0x0000000110594b52 processUIEvent() + 290 (PhoenixCECocoaGUI.mm:363) 
22 com.Apple.Phoenix.UI   0x000000011058e152 Phoenix::Core::UICocoaImpl::processEvent() + 44 (UICocoaImpl.mm:61) 
23 com.Apple.MyAppCE    0x000000010d8ae62e main + 2302 (mainer.cpp:180) 
24 com.Apple.MyAppCE    0x000000010d89b604 start + 52 


Thread 0 crashed with X86 Thread State (64-bit): 
    rax: 0x000000000000000f rbx: 0xffffffffffffffff rcx: 0x0000000001010101 rdx: 0x0000000000000001 
    rdi: 0xffffffffffffffff rsi: 0x00007fff7268ea80 rbp: 0x00007fff523631b0 rsp: 0x00007fff52363028 
    r8: 0x00007fff72435a30 r9: 0x00007fff72435a01 r10: 0x0000000000000000 r11: 0x00007f968c000600 
    r12: 0x0000000000000000 r13: 0x0000000000000000 r14: 0x0000000000000001 r15: 0x000000000000000c 
    rip: 0x00007fff82c5d62f rfl: 0x0000000000010206 cr2: 0x0000000000000018 
+0

Вы подумали о возможности того, что "' [self.shufflePositionArray count] '" может быть нулевым? Вы сразу же получите крах, если попытаетесь делить что угодно на ноль. –

+0

Да, у меня есть проверка: if (shufflePositionArray! = Nil && [self.shufflePositionArray count]! = 0) { – AnuRV

ответ

1

Если у вас есть аварии, выкладываю трассировку.

Предполагая, что вы не вырезать некоторые соответствующий код, единственный способ, которым processwindowlocation_=(processwindowlocation_+1)%[self.shufflePositionArray count]; может рухнуть (при условии, что это на самом деле линия аварии), если либо self является недействительным или shufflePositionArray является недействительным.

Отметьте, что недействительный не означает nil; nil просто вернет 0 для счета.

Заметим, также, что проверка не-ноль здесь бессмысленно:

 if(shufflePositionArray!=nil){ 
      [shufflePositionArray release]; 
     } 

Это крах нечетное. Я бы не ожидал, что сбой ваш код.

Попробуйте включить обнаружение зомби (инструменты - Google может найти дополнительную информацию, если вам нужно) и посмотреть, является ли это проблемой с высвобождением.

+0

Я понимаю, что shufflePositionArray может быть недействительным по причинам, например, если он был выпущен другим потоком или так ... но что есть вероятность, что я может быть недействительным? – AnuRV

+0

'self', вероятно, не будет недействительным; или маловероятно, что это так. – bbum

Смежные вопросы