0

最近我完成了我的第一个 Iphone 应用程序,它运行良好....除了当我使用仪器进行紧张的会话后一段时间没有泄漏时发现泄漏,突然获得大约 1.3Kb 的价值。在堆栈跟踪中,它们都指向我在将 UIViewControler 推送到导航控制器后释放它的确切行(我将把这段代码贴得更远一点)。几次浏览 ViewControlers 并再次返回后,泄漏似乎发生了。我知道这是一个非常普遍的问题,但我希望有人能指出我正确的方向。我花了几天时间试图解决这个问题,它开始让我发疯!

我的应用程序是基于导航的应用程序,简而言之,它的工作原理如下:

从 UIViewControler 开始,当按下按钮时,它会转到另一个包含 TableView 的 UIViewControler。从这里根据填充 TableView 的数组的内容,它可以转到包含 PickerView 的 UIViewControler,然后转到最后一个 UIViewControler,或者直接转到最后一个 UIViewControler,绕过带有 PickerView 的那个。

这是堆栈跟踪显示泄漏已打开的代码:

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 吗?我没有在其他任何地方调用第三个保留,它只存在于这个函数中。

我有一堆来自 UIkit 和 QuartsZone 的泄漏。我有其中一些的屏幕截图,在堆栈跟踪中都指向相同的代码片段,在同一个函数中,在同一个对象中,如上所述,在跟踪中的某个点:

这是图片的链接,因为我还不能发布图片:链接不再有效

这是列表中第一个 GeneralBlock-16 的完整堆栈跟踪。粗体字(第 29 行)是上面的代码片段:


0 libSystem.B.dylib malloc

1 核心基础-[__NSArrayM insertObject:atIndex:]

2 核心基础-[__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 实例化WithOwner:选项:]

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

18 UIKit-[UIViewController _loadViewFromNibNamed:bundle:]

19 UIKit-[UIViewController 加载视图]

20 UIKit-[UIViewController 视图]

21 UIKit-[UIViewController 内容滚动视图]

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 诱杀陷阱-[SelectEventTypeviewcontroler ChooseThisOne] /Users/chriswyllie/Documents/Booby Trap/Booby Trap/Classes/SelectEventTypeviewcontroler.m:91

30 核心基础-[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(内部)_sendActionsForEvents:withEvent:]

35 UIKit-[UIControl touchesEnded:withEvent:]

36 UIKit-[UIWindow_sendTouchesForEvent:]

37 UIKit-[UIWindow 发送事件:]

38 UIKit-[UIApplication 发送事件:]

39 UIKit_UIApplicationHandleEvent

40 图形服务 PurpleEventCallback

41核心基础 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

42 核心基础 __CFRunLoopDoSource1

43 核心基础 __CFRunLoopRun

44 CoreFoundation CFRunLoopRunSpecific

45 核心基础 CFRunLoopRunInMode

46 图形服务 GSEventRunModal

47 图形服务 GSEventRun

48 UIKit-[UIApplication_run]

49 UIKit UIApplicationMain

50 诱杀装置主 /Users/chriswyllie/Documents/Booby Trap/Booby Trap/main.m:14

51 陷阱开始


提前感谢您的帮助,我希望我只是在做一些愚蠢的事情,我需要一双新的眼睛才能看到它。如果您需要更多信息,请告诉我。

4

2 回答 2

3

好吧,我是一个工具:)

我没有在每个 viewControler 中正确处理 IBOutlets。

我没有使用带有保留的@property 声明每个 IBOutlet,而是在 viewDidUnload 方法中使用“self.someLabel = nil”(释放并将 IBOutlets 设置为 nil)来发出内存警告,然后最终在 dealloc 中释放。

因此工具。哈哈

我正在做的是声明“IBOutlet UILabel *someLabel;” 在没有@property 的标头中,这导致了上面看到的泄漏,它们不会立即发生,需要一段时间,当他们进行堆栈跟踪时,每件事都无济于事。

我发现泄漏的唯一方法是将所有内容从我的应用程序中删除,我的意思是直到泄漏消失为止。

感谢您的帮助 Ishu Gupta,我很高兴我们取得了成果。

以下是显示如何正确执行 IBOutlet 的相关链接:如果我不保留 IBOutlet 会怎样?

于 2010-12-09T23:42:35.860 回答
0

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

并删除

【第三版】;这条线。

您只能修复由于您的代码而出现的泄漏(忘记释放任何对象或一些错误的东西)。但有时你会得到额外的泄漏,这些泄漏存在于 iphone sdk 中。实际上,iPhone 的某些功能或属性存在泄漏。因此只有在您更改这些使用时才能修复这些问题。还有一件事,如果它不会随着应用程序操作而增加,那么 1.3 KB 泄漏也不错。

于 2010-12-07T05:00:22.203 回答