2010-03-28 3 views
4

현재 작업중 인 코드는 NSNumber 객체를 배열에 추가해야합니다. 값이 0-12 인 NSNumbers는 모두 정상적으로 추가되지만 13 일 이후에는 EXC_BAD_ACCESS가 발생합니다. NSZombieEnabled를 켜고 현재 *** -[CFNumber retain]: message sent to deallocated instance 0x3c78420을 얻고 있습니다.
#0 0x01eac3a7 in ___forwarding___
#1 0x01e886c2 in __forwarding_prep_0___
#2 0x01e3f988 in CFRetain
#3 0x01e4b586 in _CFArrayReplaceValues
#4 0x0002a2f9 in -[NSCFArray insertObject:atIndex:]
#5 0x0002a274 in -[NSCFArray addObject:]
#6 0x00010a3b in -[Faves addObject:] at Faves.m:24
#7 0x000062ff in -[ShowController processFave] at ShowController.m:458
#8 0x002af405 in -[UIApplication sendAction:to:from:forEvent:]
: 여기 NSNumber> = 13은 유지되지 않습니다. 그 밖의 모든 것

호출 스택의 15, #9 0x00312b4e in -[UIControl sendAction:to:forEvent:]
#10 0x00314d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#11 0x00313abb in -[UIControl touchesEnded:withEvent:]
#12 0x002c8ddf in -[UIWindow _sendTouchesForEvent:]
#13 0x002b27c8 in -[UIApplication sendEvent:]
#14 0x002b9061 in _UIApplicationHandleEvent
#15 0x02566d59 in PurpleEventCallback
#16 0x01e83b80 in CFRunLoopRunSpecific #18 0x02565615 in GSEventRunModal
#19 0x025656da in GSEventRun
01
#17 0x01e82c48 in CFRunLoopRunInMode
이 특정 범위의 NSNumbers에 격리되지 않은 경우 23,
#21 0x00002498 in main at main.m:14

, 나는 내 메모리 관리와 함께 뭔가를 망쳐 가정 싶지만, 난 그냥 아무 생각 없어했습니다.

아이디어가 있으십니까?

감사합니다,


조쉬
+8

왜냐하면 ObjC에는 triskaidekaphobia가 있기 때문입니다. – kennytm

답변

11

숫자 0에서 12는 다른 질문 here에 대답 할 때 발견 한대로 특별합니다. 이것은 구현 세부 사항 인 이 아니고 언어 지정 사항이 아닙니다.

기본적으로 최대 12 개까지의 숫자는 이미 존재하는 NSNumber에 대한 참조를 제공합니다.이 숫자는 변경할 수 없다는 사실 때문에 가능합니다. 조사에 따르면 13 이상의 숫자가 별도의 사례를 제시했습니다.

은 결국 메모리 관리를 망쳐 놓았습니다. 13보다 작은 숫자는 이미 존재하는 숫자에 대한 참조 일 가능성이 높습니다. 그 경우에는 베이컨을 절약 할 수 있습니다. 특정 문제를 추적 할 수 있도록 더 많은 코드를 게시하는 것이 좋습니다.


그리고 다른 대답을 여기에 귀하의 의견에 따라 :

나는 코드로 유지 라인을 추가하고 모든 것을 지금은 완벽하게 작동합니다. 이유는 모르겠다. 나는 그걸 가지고 굴러 갈거야. 감사!

난 당신이 그들이 EXC_BAD_ACCESS을 유발하지 않는 이유 (13)보다 NSNumbers 이미 자신을 얻을 전에합니다 (2까지 계산 해주 1)의 수를 유지해야한다는 사실 찾을 수 있습니다 생각합니다. 분명히 당신의 코드는 모두를 잃고 있습니다. 할당 된 번호이지만 시스템은 아직 사용 중이므로 (1 이상 유지) 13 세 미만은 해제하지 않습니다.

+1

매혹적인! "0에서 12까지의 숫자는 특별하다"는 말은 시험되지 않을 수 없다. 그리고 보라, 보라, 너는 절대적으로 옳다! :) –

+0

와우. 이것은 너무 잘못되었습니다. 이것은 Objective-C에 대해 정말 싫어하는 것 중 하나입니다. 모든 숫자는 불변이어야합니다. 모든 문자열은 불변이어야합니다. 파이썬은이 권리가 있습니다. – vy32

+0

두 번째로, @ vy32에 대해, 나는 ObjC 동작과 반대되는 "내 잘못"이라는 내 대답에 대해 생각하고 있다고 생각했습니다. :-)하지만 나는 너를 이해하는지 모르겠다. NSNumber는 * 실제로 * 변경 불가능합니다. 이것이이 최적화를 가능하게합니다 (예 : NSNumber (15)를 사용하여 다른 모든 사용자를 망쳐 놓을 수는 없습니다). – paxdiablo

2

분명히 NSNumbers> (12)가 유지됩니다. 나는 이것을 자신에게 증명하는 매우 작은 프로그램을 작성하는 것이 좋습니다. 그런 다음 해당 프로그램을 가져 와서 함수로 만들고 프로그램에서 일찍 호출하십시오. 오류가 나타날 때까지 기능을 프로그램의 나중 지점으로 천천히 이동하십시오. 따라서 실제 버그를 발견하게 될 것입니다.

+0

코드에 줄을 추가하면 모든 것이 완벽하게 작동합니다. 이유는 모르겠다. 나는 그걸 가지고 굴러 갈거야. 감사합니다. – jkap

+0

@jkap 메모리 관리 규칙을 공부하고 왜 * 지금 작동하는지 파악하는 것이 가치가 있다고 제안 할 수 있습니까? 이 문제를 어떻게 해결했는지 이해하면 앞으로도 비슷한 문제가 발생할 가능성이 줄어 듭니다. –

+1

@kkap : 코드에 무작위로 코드를 추가하면 많은 양의 메모리가 누출되는 프로그램을 만들 수 있습니다. 유지/해제 규칙은 일단 당신이 그들을 grokked되면 실제로 매우 명확합니다, 그래서 무슨 일이 일어나는지 이해하기 위해 시간을 가지십시오. – Felixyz

관련 문제