NSString "initWithBytesNoCopy: length: encoding: freeWhenDone:" может изменить входные "байты"? - PullRequest
2 голосов
/ 05 ноября 2011
- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)flag

"байты" не являются константными указателями. Означает ли это, что этот метод может изменять «байты»?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Вы должны предположить, что он может видоизменяться, поскольку это подпись, и нет документации, которая в противном случае отрицает это.

Поэтому мой ответ таков: это потому, что подпись SEL не может / не можетизмените на NSMutableString s, чтобы оно было объявлено неконстантным.

Вот несколько NSString вариантов создания, которые предлагают немного больше безопасности без копирования:

  • CFStringCreateWithBytesNoCopy

  • CFStringCreateWithCStringNoCopy

  • CFStringCreateWithCharactersNoCopy

Вероятность того, что NSString API-интерфейсы, о которых идет речь, также используют их.

CF-API предоставляют более подходящие функции для изменяемых вариантов, например, CFStringCreateMutableWithExternalCharactersNoCopy, и это, вероятно, то, что NSMutableString будет использовать.

0 голосов
/ 05 ноября 2011

Технически, как говорит @WTP, байты не объявлены const, так что да, это может

На самом деле - нет. С чего бы это?

Вы видите ошибку в своем приложении, где оно появляется?

Если вы планируете быть параноиком, почему бы вам не сделать копию байтов перед вызовом этого метода?

...