在我的应用中,我有:


@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];
}

因此,我有一个显示弹出窗口的方法,可以在其中从表格视图中选择一辆汽车。该弹出窗口使用委托回调myshop.m中的一个方法,在其中我为mycar.model分配一个值,并调用上面的doA方法,所有这些工作正常,并在Output中显示mycar.model的值:
-(void) doA
{
   NSLog(@"car = %@", mycar.model );
   ...
}

但是...现在是问题所在:myshop视图中有一个按钮。当我按下此按钮时,操作将显示一个警报视图(.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"]];

我希望我现在就!至少该应用程序看起来运行良好!

谢谢很多 friend !

最佳答案

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

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

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

如果打开ARC,您的错误很有可能会消失。

关于iphone - 属性(property)失去其值(value)(漫长但易于理解),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8554636/

10-13 04:00