【问题标题】:NSMutableString to NString results in "message sent to deallocated instance"NSMutableString 到 NString 导致“发送到已释放实例的消息”
【发布时间】:2010-12-18 21:35:01
【问题描述】:

我在 NSMutableString、localPName 中有数据。我想像这样保存用户的数据:

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

编译器一直在努力教我“发送到已释放实例的消息”。除了 synthesize 和单次使用(打印有效数据)之外,我看不到 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
}

从现在开始,我几乎要出去吃午饭了。

回复“您尝试过什么?”我已经包含了我从“网络”中获得的许多建议。 How to initialize NSString to NSMutableString? Objective-C "message sent to deallocated instance 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
//  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 ...

假期快到了。感谢那些可能帮助我提前收到一两件礼物的人。

【问题讨论】:

    标签: iphone nsstring nsmutablestring


    【解决方案1】:

    testString 指向您直接分配给实例变量的autoreleased 实例。您应该改用 setter:

    self.localPName = teststring;
    

    这样您就获得了字符串的所有权(setter 通过保留实例来获得所有权),并且您也不会泄露您之前分配给它的实例(它将由 setter 正确释放)。

    【讨论】:

    • 是的。就是这样。非常非常感谢你成为另一个受人关注的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2023-03-13
    相关资源
    最近更新 更多