gpt4 book ai didi

objective-c - Foundation框架导致的 "memory leaks"怎么办?

转载 作者:太空狗 更新时间:2023-10-30 03:54:19 26 4
gpt4 key购买 nike

随着时间的推移,我目前正在处理的应用程序正在积累越来越多的内存。这并不是真正的内存泄漏,因为 Leaks 工具不会将其识别为泄漏,但它会不断占用越来越多的内存。

我一直在使用 Instruments(内存分配工具)找出为什么会发生这种情况,现在我正在制作堆快照,以便找到运行周期中不同点之间的内存差异。似乎在每个循环之后,使用的内存增加了大约 560 KB。

这是它在 Instruments 工具中的样子:

Instruments initial

并且在选择 CFString 行时:

CFString allocation

右侧的完整 Stack Trace 如下所示:

   0 CoreFoundation _CFRuntimeCreateInstance
1 CoreFoundation __CFStringCreateImmutableFunnel3
2 CoreFoundation CFStringCreateWithBytes
3 Foundation -[NSString initWithCoder:]
4 Foundation _decodeObject_old
5 SyncServices -[ISDProperty initWithCoder:]
6 SyncServices -[ISDRelationship initWithCoder:]
7 Foundation _decodeObject_old
8 Foundation _decodeValueOfObjCType
9 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
10 Foundation -[NSArray(NSArray) initWithCoder:]
11 Foundation _decodeObject_old
12 SyncServices -[ISDEntity initWithCoder:]
13 Foundation _decodeObject_old
14 Foundation _decodeValueOfObjCType
15 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
16 Foundation -[NSArray(NSArray) initWithCoder:]
17 Foundation _decodeObject_old
18 SyncServices -[ISDRelationship initWithCoder:]
19 Foundation _decodeObject_old
20 Foundation _decodeValueOfObjCType
21 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
22 Foundation -[NSArray(NSArray) initWithCoder:]
23 Foundation _decodeObject_old
24 SyncServices -[ISDEntity initWithCoder:]
25 Foundation _decodeObject_old
26 Foundation _decodeValueOfObjCType
27 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
28 Foundation -[NSArray(NSArray) initWithCoder:]
29 Foundation _decodeObject_old
30 SyncServices -[ISDRelationship initWithCoder:]
31 Foundation _decodeObject_old
32 Foundation _decodeValueOfObjCType
33 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
34 Foundation -[NSArray(NSArray) initWithCoder:]
35 Foundation _decodeObject_old
36 SyncServices -[ISDEntity initWithCoder:]
37 Foundation _decodeObject_old
38 Foundation _decodeValueOfObjCType
39 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
40 Foundation -[NSArray(NSArray) initWithCoder:]
41 Foundation _decodeObject_old
42 SyncServices -[ISDRelationship initWithCoder:]
43 Foundation _decodeObject_old
44 Foundation _decodeValueOfObjCType
45 Foundation -[NSUnarchiver decodeValueOfObjCType:at:]
46 Foundation -[NSArray(NSArray) initWithCoder:]
47 Foundation _decodeObject_old
48 SyncServices -[ISDEntity initWithCoder:]
49 Foundation _decodeObject_old
50 Foundation +[NSUnarchiver unarchiveObjectWithData:]
51 SyncServices -[ISDObjectGraphWrapper initWithCoder:]
52 Foundation -[NSKeyedPortCoder decodeObjectForKey:]
53 Foundation -[NSArray(NSArray) initWithCoder:]
54 Foundation -[NSKeyedPortCoder decodeObjectForKey:]
55 Foundation -[NSKeyedPortCoder _decodeObjectNoKey]
56 Foundation -[NSKeyedPortCoder _walkAndDecodeDataWithType:at:chase:invocation:inStructure:]
57 Foundation decodeInvocationArguments
58 Foundation -[NSKeyedPortCoder decodeInvocation]
59 Foundation -[NSKeyedPortCoder decodeObjectForKey:]
60 Foundation -[NSConnection handleRequest:sequence:]
61 Foundation -[NSConnection handlePortCoder:]
62 Foundation -[NSConnection dispatchWithComponents:]
63 Foundation __NSFireMachPort
64 CoreFoundation __CFMachPortPerform
65 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
66 CoreFoundation __CFRunLoopDoSource1
67 CoreFoundation __CFRunLoopRun
68 CoreFoundation CFRunLoopRunSpecific
69 Foundation -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
70 SyncServices -[ISyncConcreteSession _waitForTransitionFromPhase:untilDate:]
71 SyncServices +[ISyncSession _sessionWithClient:entityNames:beforeDate:clientHasTruthForEntityNames:quietlyPushTruth:target:selector:anchors:hasChanges:skip:error:]
72 SyncServices +[ISyncSession beginSessionWithClient:entityNames:beforeDate:]
73 SyncServices -[ISyncConcreteSessionDriver _beginSyncSession:]
74 SyncServices -[ISyncConcreteSessionDriver _preSync]
75 SyncServices -[ISyncConcreteSessionDriver _sync:]
76 SyncServices -[ISyncConcreteSessionDriver sync]
77 **Our application** - [SLSyncOperation performLocalSync] /Users/andrei/Desktop/MacOSX_Client/osx/Classes/SLSyncOperation.m:94
78 **Our application** -[SLSyncOperation main] /Users/andrei/Desktop/MacOSX_Client/osx/Classes/SLSyncOperation.m:251
79 Foundation -[__NSOperationInternal start]
80 Foundation ____NSOQSchedule_block_invoke_2
81 libdispatch.dylib _dispatch_call_block_and_release
82 libdispatch.dylib _dispatch_worker_thread2
83 libsystem_c.dylib _pthread_wqthread
84 libsystem_c.dylib start_wqthread

我正在使用 SyncServices 来获取联系信息。我正在使用 ISyncSessionDriver 以特定时间间隔(10 秒,也可以在内存分配图像上看到)检查(同步)新信息。代码如下所示。

SLSyncSessionDriverDataSource *dataSource = [[SLSyncSessionDriverDataSource alloc] initWithManagedObjectModel:managedObjectModel context:managedObjectContext];

ISyncSessionDriver *localDriver = [ISyncSessionDriver sessionDriverWithDataSource:dataSource];
SLSyncSessionDriverDelegate *theDelegate = [[SLSyncSessionDriverDelegate alloc] init];
[localDriver setDelegate:theDelegate];

[theDelegate release];
[dataSource release];

[localDriver sync];

感谢您能给我的任何帮助!

最佳答案

假设您发现了真正的泄漏,一些想法:

  • 您只能在可能有新内容时运行同步信息(注意 ~/Library/Application 中的变化
    使用 kqueue 或 FSEvents 支持/地址簿
    )。

  • 您可以在您定期回收的子进程中运行同步,或者根据之前的建议,只运行一次进程执行同步然后退出。

Sync Services 从来没有很好地工作过,并且从 10.7 开始就被弃用了,所以我想如果有任何额外的工作,它也不会看到太多。我不认为想出一个独立的例子是浪费时间 submit it as a bug ,特别是如果它漏得这么厉害。此外,我建议在地址簿框架上提交另一个错误,说明您希望能够检查/收到新信息/更新信息的通知。

关于objective-c - Foundation框架导致的 "memory leaks"怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com