Причина в том, что объект, возвращаемый [NSString string]
, не отвечает на селектор -initWithBytes:length:encoding:
.Это потому, что строки NSString неизменны - их нельзя изменить после создания.Метод -string
использует это преимущество и просто дает вам ссылку на постоянную строку (созданную во время компиляции), которая является пустой.
Мало того, что NSString является кластером классов.Это означает, что когда вы запрашиваете NSString, вы можете фактически получить экземпляр одного из его подклассов.Я предполагаю, что вы получаете подкласс с переопределенным -initWithBytes:length:encoding:
для создания исключения, потому что нет смысла отправлять метод init в константную строку, созданную во время компиляции.
Во втором случае высоздаем новую строку NSString во время выполнения и затем отправляем ей сообщение инициализации.Это прекрасно.Обратите внимание, что, поскольку это кластер классов, строка, возвращаемая методом init, может отличаться от той, которая была создана -alloc
.
.