Dealloc NSString导致崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dealloc NSString导致崩溃相关的知识,希望对你有一定的参考价值。

我正在研究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;这样做可能会释放仍然从其他地方引用的对象,从而导致内存损坏和硬崩溃

*)属性定义的copy属性具有误导性;它描述了为属性分配新值时会发生什么。由于该属性被公开声明为readonly,这揭示了一个实现细节,它不应该在标题中的公共定义中(最好是在不公开显示的私有接口扩展中)。随意向Apple提交错误报告,该报告永远不会得到任何关注。

以上是关于Dealloc NSString导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 发布导致崩溃

.cxx_destruct crash

dealloc时取weakself引起崩溃

WKWebView 子类在 dealloc 上崩溃

在 dealloc 中保存对象状态不起作用

创建 NSError * 导致应用程序崩溃