2011-11-05 34 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」對第一個沒有意義)? –