2012-05-21 6 views
2

Так что у меня очень странная проблема, когда при запуске моего приложения на симуляторе и iPad подключен (работает приложение на устройстве с подключенным кабелем) все работает отлично , Однако после запуска на устройстве после того, как он подключен, и я пытался использовать приложение, он выходит из строя .. пытался смотреть на крешлогам устройства и я вижу:Ошибка при запуске приложения только на устройстве

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x3672bf78 objc_msgSend + 16 
1 App      0x000ca834 -[AHAppImageData dealloc] (AHInstagramImageData.m:122) 
2 libobjc.A.dylib     0x3672d16e _objc_rootRelease + 30 
3 CoreFoundation     0x33d792e0 CFRelease + 88 
4 CoreFoundation     0x33d8ea30 -[__NSArrayM removeObjectAtIndex:] + 288 
5 CoreFoundation     0x33d84adc -[NSMutableArray removeAllObjects] + 64 
6 App      0x000f717e -[AHImageDataSource clearDataSource] (AHImageDataSource.m:53) 
7 App      0x000c0a36 __49-[AHMainViewController loadRequestWithURLString:]_block_invoke_0 (AHMainViewController.m:91) 
8 libdispatch.dylib    0x32658c52 _dispatch_call_block_and_release + 6 
9 libdispatch.dylib    0x3265aee0 _dispatch_main_queue_callback_4CF$VARIANT$mp + 188 
10 CoreFoundation     0x33e032a6 __CFRunLoopRun + 1262 
11 CoreFoundation     0x33d8649e CFRunLoopRunSpecific + 294 
12 CoreFoundation     0x33d86366 CFRunLoopRunInMode + 98 
13 GraphicsServices    0x37d68432 GSEventRunModal + 130 
14 UIKit       0x36820cce UIApplicationMain + 1074 
15 App      0x000b2860 main (main.m:16) 
16 App      0x000b2820 0xb1000 + 6176 

Любая идея, почему это происходит только на устройстве и не при запуске приложения при подключении или симуляторе?

Основываясь на комментарий ниже, я показываю код, который отвечает за это:

[[AHMyAppAPIClient sharedClient] getPath:requestURLPath parameters:nil 
      success:^(AFHTTPRequestOperation *operation, id response) { 
       [self.progressHUD_ hide:YES]; 


       self.nextPaginationURL_ = [[response valueForKey:@"pagination"] valueForKey:@"next_url"]; 

       [self.collectionView_.pullToRefreshView stopAnimating]; 
       [[NSOperationQueue sharedOperationQueue] cancelAllOperations]; 


       NSArray *arr = [response valueForKey:@"data"]; 
       if ([arr count] > 0){ 
        [[AHImageDataSource sharedDataSource] clearDataSource]; 
       } 


       for (NSDictionary * data in arr){ 
        AHInstagramImageData * imgData = [[AHInstagramImageData alloc] initWithData:data]; 
        [[AHImageDataSource sharedDataSource] addObject:imgData]; 
        [imgData release]; 
       } 


       dispatch_async(dispatch_get_main_queue(), ^{ 
        [self.collectionView_ setContentOffset:CGPointMake(0, 0)]; 
        [self.collectionView_ reloadData]; 

       }); 

      } 
      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       [self.progressHUD_ hide:YES]; 
       NSLog(@"Error fetching user data!"); 
       NSLog(@"%@", error);  

      }]; 

Это как я устанавливаю источник данных:

extern NSString * const kClearDataSource; 

@interface AHImageDataSource : NSObject 
+ (AHImageDataSource *)sharedDataSource; 
- (void) clearDataSource; 
- (void) addObject:(id) object; 
- (void) addObject:(id)object atIndex:(int) index; 
- (int) count; 
- (id) objectAtIndex:(int) index; 
@end 


NSString * const kClearDataSource = @"clearDataSource"; 

@interface AHImageDataSource() 
{ 
    NSMutableArray * imageDataSource_; 
} 

@property (nonatomic, retain) NSMutableArray * imageDataSource_; 

@end 

@implementation AHImageDataSource 
@synthesize imageDataSource_; 

+ (AHImageDataSource *)sharedDataSource { 
    static AHImageDataSource *_sharedClient = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedClient = [[self alloc] init]; 
    }); 

    return _sharedClient; 
} 


- (id)init { 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 

    NSMutableArray * temp = [[NSMutableArray alloc] initWithCapacity:200]; 
    self.imageDataSource_ = temp; 
    [temp release]; 


    return self; 
} 

-(void) clearDataSource 
{ 
    if ([self.imageDataSource_ count] > 0){ 
     [self.imageDataSource_ removeAllObjects]; 
    } 

} 

- (void) addObject:(id) object 
{ 
    [self.imageDataSource_ addObject:object]; 
} 

- (void) addObject:(id)object atIndex:(int) index 
{ 
    [self.imageDataSource_ insertObject:object atIndex:index]; 
} 

- (int) count 
{ 
    return [self.imageDataSource_ count]; 
} 

- (id) objectAtIndex:(int) index 
{ 
    if (index >= 0 && index < [self.imageDataSource_ count]){ 
     return [self.imageDataSource_ objectAtIndex:index]; 
    } 

    return nil; 
} 

- (void) dealloc 
{ 
    [super dealloc]; 
    [imageDataSource_ release]; 
} 

@end 

EDIT:

Кажется, что NSZombieEnabled, похоже, скрывает эту проблему. Когда я отключу NSZombieEnabled, он сбой теперь на симуляторе и устройстве.

+0

Если NSZombieEnabled скрывает проблему, то она почти наверняка является двойной свободной. Очень странно, что шаблон «Инструменты» не забирал его ... – MobileVet

ответ

1

Я согласен с Джим, выглядит как двойной выпуск.

Я бы использовал профиль пользователя зомби 'для проверки этой ситуации. Это может быть сделано только в симуляторе, но должно показать вам, что именно удваивается.

Как только это на 100% ясно, обычно довольно легко разрешить ситуацию.

+0

не может использовать зомби, так как отлично работает на симуляторах .. не сбой – adit

+0

Это не обязательно отлично работает на тренажер. Когда вы перевыпускаете что-то, это просто удача в том, сбой или нет. Однако переизбыток все еще происходит, и подход зомби должен работать независимо. – Jim

+0

И вы можете использовать NSZombies во время запуска кода на вашем устройстве. – Abizern

0

Похоже, вы перевыполняете экземпляр AHInstagramImageData, помещая его в словарь, а затем уменьшаете количество удержаний, достаточное для его освобождения. Затем, когда он удаляется из словаря, он снова освобождается и пытается освободить память для объекта, который больше не существует.

Опубликовать код, ответственный, и вы можете получить более подробную помощь. Одного журнала сбоев недостаточно для продолжения.

+0

Я добавил код, ответственный за это. Надеюсь, что вы сможете больше помочь .. поскольку я не вижу, где двойной релиз – adit

+0

Это код, вызывающий ошибку , но ошибка, вероятно, в том, что вы * установили * источник данных. Можете ли вы опубликовать это? – Jim

+0

Я добавил, как я установил источник данных .. дайте мне знать, если это то, что вы искали – adit

Смежные вопросы