0

最近、私は最初のIphoneアプリを完成させ、それはすりおろして動作します....しばらくして漏れがなく、楽器を使って漏れを見つけるために激しいセッションを行ったときを除いて、突然約1.3Kbの価値があります。スタックトレースでは、UIViewControlerをナビゲーションコントローラーにプッシュした後にリリースした正確な行をすべて指し示しています(このコードをもう少し下に投稿します)。リークは、ViewControlersをナビゲートして再び戻った後、発生するようです。これは非常に一般的な質問ですが、誰かが私を正しい方向に向けてくれることを願っています。私はこれを解決するために数日を費やしました、そしてそれは私を夢中にさせ始めています!

私のアプリはナビゲーションベースのアプリです。簡単に言うと、次のように機能します。

UIViewControlerで始まり、ボタンが押されると、TableViewを含む別のUIViewControlerに移動します。ここから、TableViewに入力する配列の内容に応じて、PickerViewを含むUIViewControlerに移動し、次に最後のUIViewControlerに移動するか、PickerViewを含むUIViewControlerをバイパスして最後のUIViewControlerに直接移動します。

スタックトレースがリークが発生していることを示すコードは次のとおりです。

SoundConfiger *third = [[SoundConfiger alloc] initWithNibName:@"SoundConfiger" bundle:[NSBundle mainBundle]];
    [third setTitle:@"Sound Link"];
    third.myData = myData;
    third.selectedRow = row;
    third.currentChoise = nil;
    [self.navigationController pushViewController:third animated:YES];
    [third release];    <---- Instruments says the leak is here on this line.

NavigationControllerがこのUIViewcontrolerを担当するべきではありませんか?私は他のどこにもretainを呼び出しておらず、この関数にのみ存在します。

UIkitとQuartsZoneからたくさんのリークがあります。いくつかのスクリーンショットを以下に示します。スタックトレースでは、トレースのある時点で上記と同じオブジェクト内の同じコードの同じスニペットをすべて指し示しています。

まだ画像を投稿できないため、画像へのリンクは次のとおりです。リンクは無効になりました

これは、リストの最初のGeneralBlock-16からの完全なスタックトレースです。太字(29行目)は上記のコードスニペットです。


0 libSystem.B.dylib malloc

1 CoreFoundation-[__ NSArrayM insertObject:atIndex:]

2 CoreFoundation-[__ NSArrayM addObject:]

3 UIKit-[UIView(UIViewGestures)addGestureRecognizer:]

4 UIKit-[UISwitch _commonInit]

5 UIKit-[UISwitch initWithCoder:]

6 UIKit UINibDecoderDecodeObjectForValue

7 UIKit UINibDecoderDecodeObjectForValue

8 UIKit-[UINibDecoder decodeObjectForKey:]

9 UIKit-[UIView initWithCoder:]

10 UIKit UINibDecoderDecodeObjectForValue

11 UIKit-[UINibDecoder decodeObjectForKey:]

12 UIKit-[UIRuntimeConnection initWithCoder:]

13 UIKit UINibDecoderDecodeObjectForValue

14 UIKit UINibDecoderDecodeObjectForValue

15 UIKit-[UINibDecoder decodeObjectForKey:]

16 UIKit-[UINib instanceiateWithOwner:options:]

17 UIKit-[NSBundle(UINSBundleAdditions)loadNibNamed:owner:options:]

18 UIKit-[UIViewController _loadViewFromNibNamed:bundle:]

19 UIKit-[UIViewController loadView]

20UIKit-[UIViewControllerビュー]

21 UIKit-[UIViewController contentScrollView]

22 UIKit-[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:]

23 UIKit-[UINavigationController _layoutViewController:]

24 UIKit-[UINavigationController _startTransition:fromViewController:toViewController:]

25 UIKit-[UINavigationController _startDeferredTransitionIfNeeded]

26 UIKit-[UINavigationController pushViewController:transition:forceImmediate:]

27 UIKit 0x6ea9b5

28 UIKit-[UINavigationController pushViewController:animated:]

29ブービートラップ-[SelectEventTypeviewcontrolerChooseThisOne]/Users/chriswyllie/Documents/Booby Trap / Booby Trap / Classes / SelectEventTypeviewcontroler.m:91

30 CoreFoundation-[NSObject(NSObject)performSelector:withObject:withObject:]

31 UIKit-[UIApplication sendAction:to:from:forEvent:]

32 UIKit-[UIApplication sendAction:toTarget:fromSender:forEvent:]

33 UIKit-[UIControl sendAction:to:forEvent:]

34 UIKit-[UIControl(Internal)_sendActionsForEvents:withEvent:]

35 UIKit-[UIControl touchesEnded:withEvent:]

36 UIKit-[UIWindow _sendTouchesForEvent:]

37 UIKit-[UIWindow sendEvent:]

38 UIKit-[UIApplication sendEvent:]

39 UIKit _UIApplicationHandleEvent

40 GraphicsServices PurpleEventCallback

41 CoreFoundation CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

42 CoreFoundation __CFRunLoopDoSource1

43 CoreFoundation __CFRunLoopRun

44 CoreFoundation CFRunLoopRunSpecific

45 CoreFoundation CFRunLoopRunInMode

46 GraphicsServices GSEventRunModal

47 GraphicsServices GSEventRun

48 UIKit-[UIApplication _run]

49 UIKit UIApplicationMain

50ブービートラップメイン/Users/chriswyllie/Documents/ブービートラップ/ブービートラップ/main.m:14

51ブービートラップ開始


よろしくお願いします。ばかげたことをしているだけで、それを見るには新鮮な目が必要です。さらに情報が必要な場合はお知らせください。

4

2 に答える 2

3

さて私はツールです:)

各viewControlerでIBOutletsを正しく処理していませんでした。

私は、メモリ警告のためにviewDidUnloadメソッドで「self.someLabel = nil」(解放してIBOutletsをnilに設定)を使用し、最後にdeallocで解放することで、保持付きの@propertyを使用して各IBOutletを宣言していませんでした。

したがって、ツール。笑

私が行っていたのは、「IBOutlet UILabel*someLabel;」であると宣言していました。@propertyのないヘッダーでは、これが上記のリークを引き起こしていましたが、すぐには発生しません。しばらく時間がかかり、スタックトレースを実行すると、すべてのことがあまり役に立ちません。

彼らは私がリークしているものを見つけた唯一の方法は私のアプリからすべてを取り除くことでした、そして私はリークがなくなるまですべてを意味します。

Ishu Guptaにご協力いただき、ありがとうございます。結果が出てよかったです。

IBOutletsを正しく実行する方法を示すための関連リンクは次のとおりです。IBOutletを保持しないとどうなりますか?

于 2010-12-09T23:42:35.860 に答える
0

SoundConfiger * third = [[[SoundConfiger alloc] initWithNibName:@ "SoundConfiger" bundle:[NSBundle mainBundle]] autorelease];

削除します

[3番目のリリース]; この行。

コードが原因で発生するリークのみを修正できます(オブジェクトのリリースや間違ったものを忘れてください)。ただし、余分なリークが発生する場合は、これらがiphonesdkに存在します。実際には、iPhoneの機能やプロパティの一部にリークがあります。したがって、これらは、これらの使用法を変更した場合にのみ修正できます。そして、もう1つ、1.3 KBのリークは、アプリの操作で増加しないのであれば悪くありません。

于 2010-12-07T05:00:22.203 に答える