0

EXC_BAD_ACCESS に関するすべての関連投稿を確認しましたが、まだ概念を明確にすることができませんでした。多分私は最初に基本的な概念を学ぶことに取り組まなければならないかもしれませんが、今はこの問題に取り組む必要があります..だから、専門家の助けを得るために介入しました..

これが私のコードです(関連する部分のみを貼り付けました)

//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-thread

例外の種類: EXC_BAD_ACCESS (SIGSEGV) 例外コード: 0x0000000000000018 の KERN_INVALID_ADDRESS

0x18 付近の VM リージョン: --> __TEXT 000000010d89a000-000000010d927000 [ 564K] rx/rwx SM=COW /Ihome/MyAppCE.app/Contents/MacOS/MyAppCE

アプリケーション固有の情報: objc_msgSend() セレクター名: count

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
4

1 に答える 1

1

クラッシュした場合は、バックトレースを投稿してください。

関連するコードをいくつか切り取っていないと仮定すると、processwindowlocation_=(processwindowlocation_+1)%[self.shufflePositionArray count];クラッシュする可能性がある唯一の方法は (それが実際にクラッシュの行であると仮定して) がself無効であるか、または が無効である場合shufflePositionArrayです。

無効は意味しないことに注意してくださいnil。 カウントのためにnil戻るだけです。0

また、ここでの非 nil のチェックは無意味であることにも注意してください。

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

そのクラッシュは奇妙です。あなたのコードを考えると、そこでクラッシュすることは本当に期待できません。

ゾンビの検出をオンにしてみてください (Instruments -- 必要に応じて、Google で詳細を確認できます)。

于 2013-06-04T03:24:22.110 に答える