1

NSMutableString、localPName にデータがあります。ユーザーのデータを次のように保存したい:

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

コンパイラは、「割り当て解除されたインスタンスに送信されたメッセージ」について私に教えようと懸命に努力しています。合成と 1 回の使用 (有効なデータを出力する) を除いて、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) info symbol 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
//  https://stackoverflow.com/questions/1354490/how-to-take-an-nsstring-out-of-an-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つ早く手に入れるのに貢献してくれるかもしれない人々に感謝します.

4

1 に答える 1

2

testStringインスタンス変数に直接割り当てる自動解放されたインスタンスを指します。代わりにセッターを使用する必要があります。

self.localPName = teststring;

これにより、文字列の所有権を取得し (セッターはインスタンスを保持することで所有権を取得します)、以前に割り当てたインスタンスをリークしません (セッターによって適切に解放されます)。

于 2010-12-18T21:42:15.080 に答える