NSMutableString to NString приводит к «сообщению, отправленному на освобожденный экземпляр» - PullRequest
1 голос
/ 19 декабря 2010

У меня есть данные в NSMutableString, localPName. Я хочу сохранить данные пользователя примерно так:

[[NSUserDefaults standardUserDefaults] setObject:aString forKey:@"thePNameKeyValue"];

Компилятор изо всех сил старается научить меня «сообщению, отправленному на освобожденный экземпляр». Кроме синтеза и однократного использования (который печатает действительные данные), я не вижу, где было затронуто localPName, а тем более «освобождено» », Выпустил, что угодно.

NSMutableString *localPName;
NSString        *whateverNSString;
@property(nonatomic,retain) NSMutableString *localPName;
@property(nonatomic,retain) NSString *whateverNSString;


@synthesize localPName;
@synthesize whateverNSString;
localPName = [[NSMutableString alloc] initWithCapacity:40];
//  [localPName appendString:@""];  ← seems to make no difference

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSMutableString *teststring=[NSMutableString stringWithString:textField.text];
    localPName = teststring;
    NSLog(@"at textFieldDidEnd, localPName='%@'",localPName);   // ← prints correct data
}

С этого момента я уже почти обедаю.

Чтобы ответить на вопрос «Что вы пробовали?», Я включил многие из предложений, которые я выложил в сети. Как инициализировать NSString в NSMutableString? Objective-C "сообщение отправлено освобожденному экземпляру 0x5633b0" Результаты выше были: (gdb) информационный символ 0x2f699fe0 Ни один символ не соответствует 0x2f699fe0.

//  1
//NSString *str1 = @""; 
//  str1 = [str1 stringByAppendingString:localPName];
//  2
//  NSString *str1 = [[NSString alloc] initWithString:localPName];
//  3
//  whateverNSString = [[NSString alloc] initWithString:localPName];
//  4
//  whateverNSString =localPName;   //  message sent to deallocated instance, nonatomic,retain
//  5
//  self.whateverNSString =localPName;  //  message sent to deallocated instance, nonatomic, retain
//  6
//  whateverNSString =localPName;   //  message sent to deallocated instance, nonatomic, retain
//  7
//  glbl_asNeededInt = [whateverNSString length];   //  message sent to deallocated instance, nonatomic, copy
//  NSLog(@"saveButton 3 length=%d",glbl_asNeededInt);
//  8
//  whateverNSString = localPName;  //  crash. no crash log, no console. no nuthin' 
//  9
//  /1321300/kak-izvlech-nsstring-iz-nsmutablestring
//  whateverNSString = [localPName copy];
//  10
//  whateverNSString = (NSString*) localPName;
//  11
//  NSString* aString = [NSString stringWithFormat: @"%@", localPName]; // message sent ...
//  12
// NSString* aString = [NSString stringWithString:localPName];  // message sent ...

Приближаются праздники. Я благодарю людей, которые могут помочь мне получить один или два подарка рано.

1 Ответ

2 голосов
/ 19 декабря 2010

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

self.localPName = teststring;

При этом вы вступаете во владение строкой (установщик вступает во владение, сохраняя экземпляр), и вы также не теряете экземпляр, назначенный ему ранее (онбудет правильно высвобожден сеттером).

...