uipickerview exc bad access?
-
19-09-2019 - |
문제
나는 계속해서 나쁜 액세스 오류를 얻었으며 앱이 충돌 할 때 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를 유지하지 않으므로 그들이 자동 정리되고 있습니다. 모든 imageName 통화 후에는 IE를 유지해야합니다.
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]];
}
조금 더 깨끗합니다;)
편집하다: 더글러스 대답의 후반부를 작성하는 동안 코드를 정리하는 것과 같은 아이디어가있었습니다. :)
다른 팁
아홉 번째 대상은 이름에 공간이있는 유일한 대상입니까? 나는 그것이 어떻게 그것을 깨뜨릴 수 있는지 알지 못하고 그것과 다른 사람들의 차이점을 찾습니다. 이미지는 "bungeejumper.png"대신 "Bungee 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