Я не знаю, имеет ли это какое-либо отношение к этому, но если вы читаете документацию по методу initWithString:
, он возвращает экземпляр подкласса NSString
, который может или не может быть экземпляром NSMutableString
Попробуйте вместо этого, он будет делать то, что вы хотите:
currentRow = [@"VehicleYear" mutableCopy];
Кроме того, в 99% случаев вы хотите получить строковое свойство класса, который вы хотите объявить как:
@property(readwrite,copy)NSString *name;
Если вы объявляете свойство строки readwrite как что-либо кроме копии, тогда любой, кто его устанавливает, может изменить свою строку и повлиять на внутреннее состояние вашего объекта, что обычно не то, что вам нужно.Если исходная строка не является изменяемой, то ее метод копирования все равно сохраняет, поэтому производительность не теряется в том случае, если она имеет значение.
Если вы хотите, чтобы внутренняя изменяемая строка не могла быть изменена внешним пользователем, вы, вероятно, захотитеобъявить свойство следующим образом:
@property(readwrite,copy)NSString *name;
И затем самостоятельно реализовать -name
и -setName:
, чтобы вы могли вызвать -mutableCopy
, чтобы установить его, и -copy
в получателе, чтобы они не могли изменитьсяваше внутреннее состояние.Я много писал об этом в своем блоге .
Обратите внимание, что
@property(readwrite,copy)NSMutableString *name;
не делает то, что кто-то хочет, когда вы @ синтезируете средства доступа в качестве установщикавызывает -copy
и в результате получает NSString, которая не является NSMutableString.