[iOS]应用程序崩溃

时间:2011-04-20 14:04:15

标签: ios

在我的Mac iPhone模拟器(iPhone模拟器4.0)中我运行我的应用程序没有问题,但当我将其更改为另一台运行iPhone模拟器4.2的Mac时,它会在应用程序中的某个位置点击按钮,可能是调试器的版本(4.0和4.2)是潜在崩溃的原因?提前thx:))

修改

这是我怀疑它可能导致崩溃的代码'因为我在其中使用UIPickerView代码:

- (void)viewDidLoad {
    ((UILabel *)[[[[[[switchCommerce subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"oui";
        ((UILabel *)[[[[[[switchCommerce subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"non";
        ((UILabel *)[[[[[[switchStationDeLavage subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"oui";
        ((UILabel *)[[[[[[switchStationDeLavage subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"non";
        [rayonDeRechercheSlider setValue:35 animated:YES];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.0];
        CGAffineTransform transform=CGAffineTransformMakeTranslation(0,480);
        pickerViewTypeCarburant.transform=transform;
        pickerViewNomStation.transform=transform;
        [UIView commitAnimations];
        [super viewDidLoad];
        typeCarburantTextField.delegate=self;
        nomDeStationTextField.delegate=self;
        pickerArrayTypeCarburant=[[NSMutableArray alloc] initWithObjects:@"Sans Plomb 95",@"Gazole",@"Super Gazole",@"GNV",@"Sans Plomb 98",@"SP95-E10",@"E85",nil];
        pickerArrayNomStation=[[NSMutableArray alloc] initWithObjects:@"TOTAL",@"SHELL",@"ESSO",@"CARREFOUR",@"BP",@"AGIP",@"CASINO",@"LECLERC",@"AUCHAN",@"ELF",@"AVIA",@"SUPER U",nil];//added
    }

1 个答案:

答案 0 :(得分:1)

代码中的一个潜在问题是,您似乎在不使用pickerArrayTypeCarburant表示法的情况下分配给可变数组属性(pickerArrayNomStation& self.)。这意味着在不使用retain语义的情况下分配数组(假设您的@property数组声明被告知使用retain)。

这样做的结果是,当您尝试稍后在代码中访问此数组时,您会发现该数组尚未保留,并且您可能会收到某种内存警告。试试这个:

self.pickerArrayTypeCarburant=[[NSMutableArray alloc] initWithObjects:@"Sans Plomb 95",@"Gazole",@"Super Gazole",@"GNV",@"Sans Plomb 98",@"SP95-E10",@"E85",nil];
self.pickerArrayNomStation=[[NSMutableArray alloc] initWithObjects:@"TOTAL",@"SHELL",@"ESSO",@"CARREFOUR",@"BP",@"AGIP",@"CASINO",@"LECLERC",@"AUCHAN",@"ELF",@"AVIA",@"SUPER U",nil];

很难说这是否会解决你的问题,因为我不知道会抛出什么错误,但如果它与内存有关,则可能是罪魁祸首。

可以肯定的是,您可以在乐器中运行您的应用程序,看看是否存在任何不应该发生的泄漏或分配。

修改

在回复您对属性的评论时,您的头文件应该声明您的NSMutableArrays如下:

YourClass.h

@interface YourClass {
    NSMutableArray *pickerArrayTypeCarburant;
    NSMutableArray *pickerArrayNomStation;
}

@property (nonatomic, retain) NSMutableArray *pickerArrayTypeCarburant;
@property (nonatomic, retain) NSMutableArray *pickerArrayNomStation;


// Any method names here...


@end

位于.m文件的顶部,位于@implementation行的下方:

@synthesize pickerArrayTypeCarburant, pickerArrayNomStation;

@synthesize部分将根据您在@property行上提供的信息自动为您的媒体资源创建所需的访问者和变更者。在这种情况下,我已经定义了属性应该使用retain语义,这意味着当您使用self.(即self.pickerArrayNomStation = anArray;)为您的属性赋值时,您分配给它的数组将自动保留由您的财产。确保在分配给使用retain的属性时包含self.,因为这是告诉它使用生成的mutator方法,而不是仅保留实例变量而不保留。

顺便说一下,确保以这种方式生成保留属性时,在[myProperty release];方法中调用dealloc,并且(假设您的类是视图控制器...){{ 1}}在您的self.myProperty = nil方法中。这可确保在不再需要视图和视图控制器时正确释放任何保留的对象。

如果您需要有关此内容的更多信息,Apple的文档就是您的朋友。我在开始时发现他们的编程指南非常有用。我在你的回答中将你的评论链接起来的指南是一个很好的开始。

希望这有帮助。

编辑2

不确定这是否有帮助,但我有时发现以这种方式分配数组更安全......在您分配给数组属性的ViewDidLoad方法的底部,将代码更改为:

viewDidUnload