문제

나는 계속해서 나쁜 액세스 오류를 얻었으며 앱이 충돌 할 때 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];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top