iOS:错误和崩溃由 NSString 与 C malloc



正在测试一些代码,发现以下行的错误:

NSString *stringA = @"C99";
NSString *stringB = (__bridge id)malloc(sizeof (stringA));

当然,没有必要以这种方式alloc NSString,我也不需要这样做。同样,我只是在测试其他东西,我碰巧偶然发现了这个。

错误如下:

线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x20)

在控制台中:

(分行)

概括一下,也许我应该问:

我们可以通过使用malloc来分配Objective-C对象吗?

以前有没有人遇到过这种情况(我对此表示怀疑,因为我认为任何使用 Objective-C 的人都不会以这种方式alloc NSString),但与其把它推到一边,把它叫一天,我想我会问一下,看看是否有人知道这的确切原因是什么以及为什么。

可以为 Objective-C 对象使用自定义分配器。代码的问题包括:

  • NSString 是一个类集群超类(类似于"抽象类"),不能单独实例化。您需要使用NSString的一些具体子类。请注意,OS API 不提供任何此类类。
  • sizeof(stringA)是指针变量的大小,4 或 8 个字节,对于容纳 NSString 实例来说太小了。您需要使用class_getInstanceSize()来计算大小。
  • +alloc执行除分配本身以外的工作,此处不存在。您需要擦除内存并调用objc_constructInstance()
  • ARC 禁止使用完成上述任务所需的低级运行时函数。

据我所知,分配NSSTring Clike的最接近的例子是这样的:

 NSString* s4 = (NSString*)
 CFStringCreateWithFormat(kCFAllocatorDefault, 0, 
 (CFStringRef) __builtin___CFStringMakeConstantString("%@ %@ (%@)"),  s1, s2, s3);

当然,如果你想越来越低的分配级别,你应该注意CFStringRef类的较低分配。

但我希望这个答案能让你满意

在这里找到,还有更多有趣的东西

http://www.opensource.apple.com/source/clang/clang-318.0.45/src/tools/clang/test/Analysis/NSString.m

我认为你应该问的问题是代码的目的是什么。

请注意,sizeof 不返回 stringA 中的字节数,它只返回 stringA 指针的大小。谁知道分配给 stringB 的那一小块内存中有什么。也许是一根绳子,也许不是。生活充满了神秘。

最新更新