【发布时间】:2011-01-10 02:46:41
【问题描述】:
我正在尝试实现一种类似于mytunescontroller 的方法来检查它是否已添加到用户的登录项中。此代码在没有警告的情况下编译,但如果我运行泄漏性能工具,我会得到以下泄漏:
Leaked Object # Address Size Responsible Library Responsible Frame
NSURL 7 < multiple > 448 LaunchServices LSSharedFileListItemGetFSRef
NSCFString 6 < multiple > 432 LaunchServices LSSharedFileListItemGetFSRef
这是罪魁祸首:
- (BOOL)isAppStartingOnLogin
{
LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginListRef) {
NSArray *loginItemsArray = (NSArray *)LSSharedFileListCopySnapshot(loginListRef, NULL);
NSURL *itemURL;
for (id itemRef in loginItemsArray) {
if (LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef, 0, (CFURLRef *) &itemURL, NULL) == noErr) {
if ([[itemURL path] hasPrefix:[[NSBundle mainBundle] bundlePath]]) {
[loginItemsArray release];
[itemURL release];
CFRelease(loginListRef);
return YES;
}
}
}
[itemURL release];
[loginItemsArray release];
CFRelease(loginListRef);
}
return NO;
}
【问题讨论】:
-
如果你在 for 循环的中间点击了
return YES,你将泄漏数组和引用。