正在测试一些代码,发现以下行的错误:
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 的那一小块内存中有什么。也许是一根绳子,也许不是。生活充满了神秘。