我正在研究Objective-C应用程序。我有这个片段:
QString result;
NSString *tmp = nil;
tmp = [activeApp bundleIdentifier];
result = QString::fromNSString(tmp);
NSLog(@"activeApplicationBundleId 2");
if (tmp) {
NSLog(@"dealloc");
//[tmp dealloc]; // <--- this causes crash
}
else {
NSLog(@"do not dealloc");
}
return result;
我不明白为什么会崩溃。我已经检查了Apple和Bundledentifier的文档,该属性是用复制
定义的。@property(readonly, copy) NSString *bundleIdentifier;
我还读到我应该负责处理字符串。为什么这崩溃了?如果我使用:
NSRunningApplication* activeApp = [[NSWorkspace sharedWorkspace] frontmostApplication];
return QString::fromNSString([activeApp bundleIdentifier]);
我是否有内存泄漏来不处理NSSTRING?
以防万一QString :: FromnsString
QString QString::fromNSString(const NSString *string)
Constructs a new QString containing a copy of the string NSString.
预先感谢
首先,所有这些都是无关紧要的,如果您在弧线之下,则不应该在那里。因此,让我们假设您不使用ARC,并进行手动内存管理:
-
通过惯例,您不拥有
bundleIdentifier
返回的NSString,因此您不应该尝试发布* -
即使您拥有字符串,也应该通过呼叫
release
而不是dealloc
来释放它。release
将减少固定计数器,并且仅在固定计数器变为零时才调用dealloc
。根据经验,您永远不会直接致电DealLoc;这样做可能会释放仍然从其他地方引用的对象,从而导致内存损坏和严重崩溃
*)属性定义的copy
属性具有误导性;它描述了将新值分配给属性时会发生什么。由于该属性被公开声明为readonly
,因此揭示了实现细节,该细节不应在标题中的公共定义中(最好是在私人接口扩展中不公开可见)。随意向Apple提交错误报告,这将永远不会引起任何关注。