当我将NSString附加到另一个NSstring时,它给我一个错误“EXC BAD ACCESS”?

时间:2011-08-31 07:22:48

标签: iphone objective-c xcode cocoa-touch

解决....检查身体底部..

我正在使用XCODE 4

我有一个Money Calculator应用程序,我必须按下数字按钮,我必须在TextLabel上看到它。

格式如:“$ 500”

所以对于$我要附加它..

该方法效果很好,但第三次崩溃..

如果您看到代码,请休息。

在我的应用程序中,我有三个字符串变量......

- (无效)viewDidLoad中 {

  current =[[NSString alloc] retain];

  current=[[NSUserDefaults standardUserDefaults] valueForKey:@"Total"]];



  NSString *newCurrent=[NSString stringWithFormat:@"$ %@",current];

  textViewer.text=newCurrent;

 NSLog(@"%@",current);

}

- (IBAction)buttonDigitPressed:(id)sender {

NSString *str= (NSString* )[sender currentTitle];

//NSLog(@"1 The Value Of String %@",str);

NSLog(@"Befor Appending %@",current);


if([current isEqualToString:@"0"])
{
    current =  str;
}
else 
{

   current = [current stringByAppendingString:str];

    NSLog(@"After Appending %@",current);

}


NSString *newCurrent=@"$ ";

newCurrent = [newCurrent stringByAppendingString:current];

textViewer.text= newCurrent;  

} 错误是第一次正常工作但

  

当我第二次打电话时,电流指向某个标准时间   格式化的值,有时它指向某个文件名值,

错误是:EXC BAD ACCESS
当我在没有newCurrent的情况下这样做而没有附加信件时,它可以正常工作。

-------解决---------------- 我的代码中的每一件事都没问题我只需要 [当前保留]; 我将字符串附加到当前的地方。

因为我收到错误EXC BAD ACCESS意味着我指的是之前发布的Object。 所以,我保留了Object。

4 个答案:

答案 0 :(得分:0)

无需在两种情况下分配或保留字符串。

在viewdidload中


s = [[NSString alloc] init];
    s = @“a”;

点击按钮

NSString *newStr = [NSString stringWithFormat:@"b"];
s = [s stringByAppendingString:newStr];
NSLog(@"s is :%@",s);

答案 1 :(得分:0)

Hello Arpit,

你可以在.h文件中声明nsstring的属性并在.m文件中合成它,所以我认为它可以帮助你。

.h文件

@property (nonatomic,retain) 
NSString *current;

.m文件

@synthesize current;

答案 2 :(得分:0)

试试这段代码(没有内存泄漏):

-(void) viewDidLoad
{
    current=[[NSString alloc] initWithString:@"20"];
}

-(IBAction)buttonDigitPressed:(id)sender
{
    NSString *str= (NSString* )[sender currentTitle];

    NSString *nCurrent = [current stringByAppendingString:str];
    [current release];
    current = [nCurrent retain];

   NSString *newCurrent=[[NSString alloc] initWithFormat:@"a%@", current];
   textViewer.text= newCurrent;
   [newCurrent release];
}

- (void) dealloc
{
     [current release];
     [super dealloc];   
}

答案 3 :(得分:0)

这里有很多问题。

  1. 当您将current =设置为新分配的对象时,viewDidLoad中存在内存泄漏,然后将其替换为@“20”;你现在已经失去了指向已分配内存的指针。正确的方法是删除分配行。
  2. 设置newCurrent = [newCurrent stringByAppendingString:current]时,你有另一个内存泄漏;原因与1相同。
  3. 您需要更好地管理内存或仅使用NSMutableStrings。在init或viewDidLoad中将当前更改为NSMutableString alloc / init,然后只使用[current appendString:str];

    根据您粘贴的代码,我会执行以下操作。

    @interface中的

    声明了一个属性

    @property (nonatomic, retain) NSString *current;
    

    在@implementation中@synthesize

    @synthesize current; 
    
    - (void) viewdidload
    {
        self.current = @"20";
    }
    
    -(IBAction)buttonDigitPressed:(id)sender
    {
        NSString *str= (NSString* )[sender currentTitle];
        self.current = [self.current stringByAppendingString:str];
    
        NSString *newCurrent = @"a";
        newCurrent = [newCurrent stringByAppendingString:self.current];
    
        textViewer.text = newCurrent;
    }