UIPickerView EXC BADアクセス?
-
19-09-2019 - |
質問
私はEXC悪いアクセスエラーを得続けると私は、これは時にアプリがクラッシュしているので、それは私のUIPickerViewとは何かを持っていると思います。私はUIPickerViewから9番目の選択をするまで、すべてが正常に動作します。アプリは9日の選択にクラッシュするひとつひとつの時間。任意のアイデア?
- (void)viewDidLoad {
[super viewDidLoad];
list = [[NSMutableArray alloc] init];
[list addObject:@"Anvil"];
[list addObject:@"Apple"];
[list addObject:@"Arrow"];
[list addObject:@"Baby"];
[list addObject:@"Basketball"];
[list addObject:@"Beehive"];
[list addObject:@"Blimp"];
[list addObject:@"Bomb"];
[list addObject:@"Bungee Jumper"];
[list addObject:@"Cactus"];
[list addObject:@"Cake"];
[list addObject:@"Car"];
[list addObject:@"Caterpillar"];
[list addObject:@"Couch"];
[list addObject:@"Dennis"];
anvil = [UIImage imageNamed:@"anvil.png"];
apple = [UIImage imageNamed:@"apple.png"];
arrow = [UIImage imageNamed:@"arrow.png"];
baby = [UIImage imageNamed:@"baby.png"];
basketball = [UIImage imageNamed:@"basketball.png"];
beehive = [UIImage imageNamed:@"beehive.png"];
blimp = [UIImage imageNamed:@"blimp.png"];
bomb = [UIImage imageNamed:@"bomb.png"];
bungeejumper = [UIImage imageNamed:@"bungeejumper.png"];
cactus = [UIImage imageNamed:@"cactus.png"];
cake = [UIImage imageNamed:@"cake.png"];
car = [UIImage imageNamed:@"car.png"];
caterpillar = [UIImage imageNamed:@"caterpillar.png"];
couch = [UIImage imageNamed:@"couch.png"];
dennis = [UIImage imageNamed:@"dennis.png"];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{
return [list count];
}
-(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return [list objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if([[list objectAtIndex:row] isEqual:@"Anvil"]) {
[object setImage:anvil];
}
else if([[list objectAtIndex:row] isEqual:@"Apple"]) {
[object setImage:apple];
}
else if([[list objectAtIndex:row] isEqual:@"Arrow"]) {
[object setImage:arrow];
}
else if([[list objectAtIndex:row] isEqual:@"Baby"]) {
[object setImage:baby];
}
else if([[list objectAtIndex:row] isEqual:@"Basketball"]) {
[object setImage:basketball];
}
else if([[list objectAtIndex:row] isEqual:@"Beehive"]) {
[object setImage:beehive];
}
else if([[list objectAtIndex:row] isEqual:@"Blimp"]) {
[object setImage:blimp];
}
else if([[list objectAtIndex:row] isEqual:@"Bomb"]) {
[object setImage:bomb];
}
else if([[list objectAtIndex:row] isEqual:@"Bungee Jumper"]) {
[object setImage:bungeejumper];
}
else if([[list objectAtIndex:row] isEqual:@"Cactus"]) {
[object setImage:cactus];
}
else if([[list objectAtIndex:row] isEqual:@"Cake"]) {
[object setImage:cake];
}
else if([[list objectAtIndex:row] isEqual:@"Car"]) {
[object setImage:car];
}
else if([[list objectAtIndex:row] isEqual:@"Caterpillar"]) {
[object setImage:caterpillar];
}
else if([[list objectAtIndex:row] isEqual:@"Couch"]) {
[object setImage:couch];
}
else if([[list objectAtIndex:row] isEqual:@"Dennis"]) {
[object setImage:dennis];
}
}
- (void)dealloc {
[list release];
[super dealloc];
[animation release];
}
解決
彼らは自動解放されているように、
あなたはUIImagesを保持していません。すべてのimageNamed呼び出した後、あなたは保持すなわちを必要とします。
baby = [[UIImage imageNamed:@"baby.png"] retain];
または、あなたは性質(すなわち@property (nonatomic, retain) UIImage *baby;
)としてそれらを宣言した場合は、これを行うことができます
self.baby = [UIImage imageNamed:@"baby.png"];
これはそれを行うには、より正確な方法です。
<時間>しかし、このすべてのコードを扱うの良い方法ではなく、名前毎回の検査の画像の配列を使用するかもしれません。すなわちます。
imageArray = [NSArray alloc] initWithObjects:
[UIImage imageNamed:@"Anvil.png"],
[UIImage imageNamed:@"Apple.png"],
[UIImage imageNamed:@"Arrow.png"],
nil];
、その後、アイテムが選択された場合、
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
[object setImage:[imagearray objectAtIndex:row]];
}
少しクリーナーである。)
EDIT:ダグラス、私は私の答えの後半を書いていた間、のコードをクリーンアップするために同じ考えを持っていました:)
他のヒント
第9の目的は、名前にスペースを持つ唯一のですか?私はそれと他人との違いを探して、それはそれを破ることができるか表示されません。それはイメージではなく、「bungeejumper.png」の「バンジーjumper.png」と呼ばれていないのですか?
脇:代わりに、文字列のリストで、あなたは画像のタイトルのペアのリストを持つことができ、例えば
// ... snip ...
[self addPairWithTitle:@"Anvil" image:@"anvil.png"];
[self addPairWithTitle:@"Apple" image:@"apple.png"];
- (void) addPairWithTitle ....
{
// you'll need to define a MyNewPair object which retains the image and title
[list addObject:[[MyNewPair alloc] initWithTitle:title andImage:[UIImage imageNamed:imageName]];
}
// ... snip ...
... titleForRow...
return [[list objectAtIndex:row] title];
...didSelectRow...
[object setImage:[[list objectAtIndex:row]] image];
所属していません StackOverflow