在我的应用中,我有:
车
@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/