财产失去了价值(很长但很容易理解)

时间:2011-12-18 20:40:11

标签: iphone ios xcode ipad

在我的应用中,我有:

car.h

@interface car : NSObject
{
  NSString *model;
  NSString *price;
  // others atributes

}
@property(nonatomic, retain) NSString *model;
@property(nonatomic, retain) NSString *price;
...

myshop.h

#import "car.h"
@interface myshop : UIViewController...
{
  car *mycar;
}
@property(nonatomic, retain) car *mycar;
...

myshop.m

...
-(void) viewDidLoad
{
   ...
   mycar = [[car alloc] init];
}

所以,我有一个显示弹出窗口的方法,我可以从tableview中选择一辆车。这个popover在myshop.m中回调一个方法,使用委托,我在其中为mycar.model赋值,并调用上面的方法doA,所有这一切都正常,并在输出中显示mycar.model的值:

-(void) doA
{
   NSLog(@"car = %@", mycar.model );
   ...
}

但是......现在问题是:我在myshop视图中有一个buttom。当我按下此按钮时,操作会显示警报视图(.h中有代理)。此警报的返回调用:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
   [self doA];
   ...
}

当doA尝试将mycar.model写入Output时程序崩溃。 Xcode的输出视图中没有显示错误。在代码中,它显示:线程1:编程接收信号:EXEC_BAD_ACCESS

我可以从弹出视图中显示我想要的车数,但是当按下按钮,并且AlertView关闭时,程序崩溃。

仅仅是为了测试,我在其他方法中通过委托调用[self doA]并且总是应用程序崩溃。

任何想法,有什么不对?

完成代码

这里有错误吗? (这是car.m的一种方法)

- (void) setValues: (NSDictionary *) data  
{

    model = [data objectForKey:@"model"];
    price = [data objectForKey:@"price"];
    ...

我没有在代码中的任何地方初始化属性(模型,价格......)。

已解决!!!

这是内存管理问题!

我改变了

model = [data objectForKey:@"model"];

通过

model = [[NSString alloc] initWithFormat:@"%@", [data objectForKey:@"model"]];

我希望我现在就是这样!至少应用程序可以很好地运行!

非常感谢朋友们!

2 个答案:

答案 0 :(得分:1)

您的代码中某处存在内存管理错误。我不知道bug在哪里,它几乎肯定不在你发布的代码中(这对我来说都很完美)。

除非您发布更多代码,否则我们无法帮助您解决此问题。

我强烈建议您启用ARC。这是相当新的,但现在已经足够大了,每个人都应该开始使用它。

如果你打开ARC,你的bug很可能会消失。

答案 1 :(得分:0)

您发布的代码看起来不错,但在其他地方您必须过度释放mycar。使用“僵尸”工具对其进行剖析,它会告诉您它的发布位置。