2011-11-05 112 views
2
- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)flag 

“字节”不是常量指针。这是否意味着这种方法可能会修改“字节”?NSString“initWithBytesNoCopy:length:encoding:freeWhenDone:”可能会修改输入“bytes”?

+0

字节不是常量指针。至少我在该方法声明中看不到“const”。 – 2011-11-05 10:39:13

+0

@WTP - 他就是这么说的。为什么它不是常量? –

+0

如果freeWhenDone = YES,它不仅可以修改字符,甚至可以调用free()。一旦你调用该方法,角色不再是你的,所以不管他们是否被修改都不是你的事情。 – gnasher729

回答

1

您应该假设它可能会发生变异,因为这是签名,并且没有其他否定的文档。

所以我的回答是:这是因为SEL的签名不会/不能更改为NSMutableString s它被声明为非常量。

这里有一些NSString创造替代这表明多一点安全无副本:

  • CFStringCreateWithBytesNoCopy

  • CFStringCreateWithCStringNoCopy

  • CFStringCreateWithCharactersNoCopy

有问题的NSString API也可能使用这些API。

CF-API为可变变体提供更适当的功能,例如, CFStringCreateMutableWithExternalCharactersNoCopy,这些可能是NSMutableString会使用的。

0

技术上,如@WTP说,字节不宣const所以是的,它可能

在现实 - 没有。为什么呢?

你在应用程序中发现了一个错误吗?

如果你打算成为偏执狂,为什么不在调用这个方法之前创建一个字节副本?

+0

然而,人们并不知道常规版本和“NoCopy”版本有什么区别。从规范来看并不明显。 –

+0

在这种情况下,我猜这是隐含的,你不想改变字节的值,所以他们没有打扰const。就我个人而言,我会将它放在那里,以清楚该方法的意图是什么。并且没有“常规”和“无复制”版本 - 如果您希望它复制副本,则必须自己进行复制(即使用memcpy)。 – deanWombourne

+0

当我看到NSString规范时,我看到'initWithBytes:length:encoding:'和'initWithBytesNoCopy:length:encoding:freeWhenDone:'。第二个与第一个不同(鉴于“freeWhenDone”对第一个没有意义)? –