2010-01-06 14 views
5

iPhone uygulamamda NSAssert kullanmaya çalışıyorum, bu nedenle beklenmedik bir durum oluşursa, uygulama başarısız olur ve kilitlenme günlüğünde anlamlı bir mesajla kilitlenir.1 NSAssert kullaniciları thread içinde kullanılabilir

Başarısız olan ve yürütmeyi durdurduğu varsayılan olarak NSInternalInconsistencyException yükseldiği için başarısız olan NSAssert ana iş parçacığı üzerinde çalışıyorsa bu iyi çalışır. Ama ben de arka plan iş parçacığı içinde işlem yapıyorum, bu durumda NSAssert sadece iş parçacığı iptal eder, ancak programlama çalışmaya devam eder.

- (void)main { 
    @try { 
     int x = 14; 
     ... 
     NSAssert1(x > 20, @"x should be greater than 20, was %d", x); 
     ... 
    } 
    @catch (NSException *e) { 
     [e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES]; 
    } 
} 

daha iyi bir yolu var mı:

Bulunduğum çözeltisi (, NSOperation 'ın main yöntem bu durumda) yakalamak ve ana iş parçacığı istisna rethrow etmektir? Belki özel bir NSAssertionHandler kullanıyor musunuz?

Ben sadece statik bir ek açıklama ile C'ler assert kullanabilirsiniz biliyorum:

assert(x > 20 && "x should be greater than 20"); 

Ama bu beni x gerçek başarısız değerinin ne göstermesine izin vermez.

+0

Aynı sorunu yaşıyorum ama önerilen çözüm benim için çalışmayacak. NSAssert tetikleniyor, iş parçacığı ölüyor, ancak uygulama çalışmaya devam ediyor. Cocos2D motorunu kullanıyorum. Herkes daha eksiksiz bir çözüm sağlayabilir mi? –

cevap

1

NSAssert kodunu bir test koduyla ve ardından bir istisna artışıyla değiştirebilirsiniz. Bu şekilde, onaylama başarısız olursa, bir istisna atılır, @catch bloğu tarafından yakalanır ve ana iş parçacığında yeniden yükseltilir.

Not: Kompakt bir form sağlamak için bir C makrosu tanımlayabilirsiniz.

+0

NSAssert varsayılan olarak budur - bir NSInternalInconsistencyException yükseltir. Yani yukarıdaki catch/re-raise çözümünü savunuyor musunuz? – sickp

+0

Belgeleri yeniden okudum ve NSAssert bir istisna oluşturuyor. Böylece mevcut çözümünüz doğru görünüyor. –

İlgili konular