Dealloc NSString 导致崩溃
Dealloc NSString causes crash
我正在处理 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 的文档并且 bundleIdentifier 是 属性 定义的 copy
@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 下,则不应存在。因此,假设您没有使用 ARC,并进行手动内存管理:
按照惯例,您不拥有 bundleIdentifier
返回的 NSString,因此您不应尝试释放它*
即使您拥有该字符串,您也应该通过调用 release
而不是 dealloc
来释放它。 release
将递减保留计数器,并且仅在保留计数器变为零时才调用 dealloc
。根据经验,您永远不会 直接调用 dealloc;这样做可能会释放仍然从其他地方引用的 object,导致内存损坏和硬崩溃
*) 属性 定义的 copy
属性具有误导性;它描述了将新值分配给 属性 时发生的情况。由于 属性 被 public 声明为 readonly
,这揭示了一个实现细节,它不应该在 header 的 public 定义中(它会最好在不 public 不可见的私有接口扩展中)。请随时向 Apple 提交错误报告,这将永远不会受到任何关注。
我正在处理 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 的文档并且 bundleIdentifier 是 属性 定义的 copy
@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 下,则不应存在。因此,假设您没有使用 ARC,并进行手动内存管理:
按照惯例,您不拥有
bundleIdentifier
返回的 NSString,因此您不应尝试释放它*即使您拥有该字符串,您也应该通过调用
release
而不是dealloc
来释放它。release
将递减保留计数器,并且仅在保留计数器变为零时才调用dealloc
。根据经验,您永远不会 直接调用 dealloc;这样做可能会释放仍然从其他地方引用的 object,导致内存损坏和硬崩溃
*) 属性 定义的 copy
属性具有误导性;它描述了将新值分配给 属性 时发生的情况。由于 属性 被 public 声明为 readonly
,这揭示了一个实现细节,它不应该在 header 的 public 定义中(它会最好在不 public 不可见的私有接口扩展中)。请随时向 Apple 提交错误报告,这将永远不会受到任何关注。