在我的应用中,我有:
@interface car : NSObject
{
NSString *model;
NSString *price;
// others atributes
}
@property(nonatomic, retain) NSString *model;
@property(nonatomic, retain) NSString *price;
...
#import "car.h"
@interface myshop : UIViewController...
{
car *mycar;
}
@property(nonatomic, retain) car *mycar;
...
...
-(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"]];
我希望我现在就是这样!至少应用程序可以很好地运行!
非常感谢朋友们!
答案 0 :(得分:1)
您的代码中某处存在内存管理错误。我不知道bug在哪里,它几乎肯定不在你发布的代码中(这对我来说都很完美)。
除非您发布更多代码,否则我们无法帮助您解决此问题。
我强烈建议您启用ARC。这是相当新的,但现在已经足够大了,每个人都应该开始使用它。
如果你打开ARC,你的bug很可能会消失。
答案 1 :(得分:0)
您发布的代码看起来不错,但在其他地方您必须过度释放mycar。使用“僵尸”工具对其进行剖析,它会告诉您它的发布位置。