Начиная с iOS9, внутренний указатель NSString, полученный из фрагмента ниже , стал доступен только для чтения и генерирует неправильный доступ при попытке установить байты.
unsigned char *stringChars = (unsigned char *)CFStringGetCStringPtr((CFStringRef)string, CFStringGetSystemEncoding());
Это возможно с NSMutableString, но тогда, если у вас есть другой источник NSString, скажем из текстового поля, этот источник все еще будет в памяти, и вам все еще не повезло.
Если вы создаете новую строку NSString, лучший способ - реализовать собственный класс String с базовым байтовым массивом. Укажите метод для создания копий NSString с использованием базового байтового массива в качестве внутреннего указателя.
-(NSString *)string
{
return [[NSString alloc] initWithBytesNoCopy:_buff length:_length encoding:NSUTF8StringEncoding freeWhenDone:NO];
}
// Will prematurely wipe data and all its copies when called
- (void)clear
{
// Volatile keyword disables compiler's optimization
volatile unsigned char *t = (unsigned char *)_buff;
int len = _length;
while (len--) {
*t++ = 0;
}
}
// In case you forget to clear, it will cleared on dealloc
- (void)dealloc
{
[self clear];
free(_buff);
}