'Örneğe gönderilen tanınmayan seçici' hatasını nasıl ayıklayabilirim?


101

Tablo görünümüm için özel bir tablo hücresi görünümü oluşturuyorum. Özel hücrenin bir resim görünümünü (film şeridinde) koduma swift'te bağladıktan sonra aşağıdaki hatayı alıyorum.

[UITableViewCellContentView image]: unrecognized selector sent to instance 0x7fb4fad7fd20'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ccbb3f5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010e7e9bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010ccc250d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010cc1a7fc ___forwarding___ + 988
    4   CoreFoundation                      0x000000010cc1a398 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x000000010d7d8881 -[UITableViewCell _marginWidth] + 151
    6   UIKit                               0x000000010d7ca23d -[UITableViewCell _separatorFrame] + 70
    7   UIKit                               0x000000010d7ca6fa -[UITableViewCell _updateSeparatorContent] + 360
    8   UIKit                               0x000000010d7d4e85 -[UITableViewCell _setSectionLocation:animated:forceBackgroundSetup:] + 1174
    9   UIKit                               0x000000010d634ea8 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1822
    10  UIKit                               0x000000010d5b5eae +[UIView(Animation) performWithoutAnimation:] + 65
    11  UIKit                               0x000000010d63477b -[UITableView _configureCellForDisplay:forIndexPath:] + 312
    12  UIKit                               0x000000010d63bcec -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 533
    13  UIKit                               0x000000010d61b7f1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
    14  UIKit                               0x000000010d63165c -[UITableView layoutSubviews] + 213
    15  UIKit                               0x000000010d5be199 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
    16  QuartzCore                          0x00000001114b6f98 -[CALayer layoutSublayers] + 150
    17  QuartzCore                          0x00000001114abbbe _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    18  QuartzCore                          0x00000001114aba2e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    19  QuartzCore                          0x0000000111419ade _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
    20  QuartzCore                          0x000000011141abea _ZN2CA11Transaction6commitEv + 390
    21  QuartzCore                          0x000000011141b255 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
    22  CoreFoundation                      0x000000010cbf0347 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    23  CoreFoundation                      0x000000010cbf02a0 __CFRunLoopDoObservers + 368
    24  CoreFoundation                      0x000000010cbe60d3 __CFRunLoopRun + 1123
    25  CoreFoundation                      0x000000010cbe5a06 CFRunLoopRunSpecific + 470
    26  GraphicsServices                    0x0000000110daa9f0 GSEventRunModal + 161
    27  UIKit                               0x000000010d545550 UIApplicationMain + 1282
    28  TestWork                          0x000000010caa432e top_level_code + 78
    29  TestWork                          0x000000010caa436a main + 42
    30  libdyld.dylib                       0x000000010efc3145 start + 1
    31  ???                                 0x0000000000000001 0x0 + 1
)

Lütfen bana bu hatayı nasıl çözeceğimi söyler misiniz?

Teşekkür ederim.

Projeme bir istisna kesme noktası ekliyorum.

Bu, kırıldığı yer çizgisidir.

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as ItemTableViewCell  <---------------

Ama kodumda 'resim' kullanmıyorum.


2
bir yeri arıyorsun image].. ama yanlış nesneye. hatanın ilk satırı size çok şey söylüyor
ccwasden

1
UITableViewCellContentView'da [image] çağrısını durdurun - bu onu düzeltir. Bize bu çökmeye neden olan kodu gösterin.
Grzegorz Krukowski

1
TableViewCell'de bir görüntü kullandığınızı düşünüyorum, ancak bu görüntü paketinizde olmayabilir.
Nand Parikh

Yanıtlar:


102

Sembolik bir kesme noktası ayarlamayı deneyin -[NSObject(NSObject) doesNotRecognizeSelector:]. [+]Kesme noktası eklemek için Kesme Noktası Gezgini'nin sol alt köşesine tıklamanız yeterlidir . Ardından 'Sembolik Kesme Noktası Ekle'yi tıklayın. Çökmenizi şimdi yeniden oluşturmak, kodunuzda sorunun nerede oluştuğu konusunda size daha iyi bir fikir verecektir.

görüntü açıklamasını buraya girin


17
Ayrıca bir istisna kesme noktası da eklenebilir .
rebello95

1
Günümü kurtardım kardeşim.
AntiMoron

1
Teşekkürler çok faydalı
Mohd Sadham

35

Kullanarak bu tür çökmeleri kolayca takip edebilirsiniz Exception Breakpoints.

Açın Breakpoint Navigatorve ekleyin

görüntü açıklamasını buraya girin

İstisna Kesme Noktasını eklediğinizde, seçeneği açılarak Exception.

görüntü açıklamasını buraya girin

Seçin Objective-C.

Kodu çalıştırın ve uygulamayı kilitleyin, kesme noktası sizi kodun çöktüğü noktaya durduracaktır.


AppDelegate satır 1'de oluyor. Şimdi ne olacak? :(
Daniel Springer

AppDelegate'de yazılmış kodunuzun bir kısmını gösterebilir misiniz? Kesme noktasını duraklattığı yer. Ve ayrıca günlükler.
Vatsal K

uygulama temsilcisinin ilan edildiği 1. satırda duraklıyor
Daniel Springer

Bazı çerçeveler nedeniyle durakladığı durumlar vardır, ancak endişelenmeyin, uygulamayı çalıştırmak için 3-4 kez devam düğmesine basmanız gerekebilir.
Vatsal K

Böyle bir durumda bu bir hata değil, Bazı eski çerçeveler bu tür bir soruna neden oluyor. Eski çerçevelerinizi yeni / güncellenmiş çerçevelere güncelleyerek deneyin. Bu sorunu çözmelidir.
Vatsal K

30

Kritik ilk adım, hata mesajını analiz etmektir:

[UITableViewCellContentView image]: unrecognized selector sent to instance

Bu size "mesajın" imageUITableViewCellContentView sınıfının bir nesnesine "gönderildiğini" söyler . (Başka bir deyişle, yöntemi çağırmak için bir girişimde bulunulduimage UITableViewCellContentView sınıfının bir nesnesinde .)

Sorulacak ilk şey "Bu hiç mantıklı geliyor mu?" Adlandırılmış sınıfın bir Imageyöntemi olabilir, ancak bir imageyöntemi olmayabilir ve bu nedenle çağrıda yanlış yöntem adı kullanılmış olabilir. Veya adlandırılmış yöntem olabilir someMethod:someParm:, ancak sınıf uygularsomeMethod:someParm:anotherParm: , yani çağrıda bir parametrenin atlandığı anlamına gelir.

Bununla birlikte, çoğu zaman, adlandırılmış sınıfın, belirsiz bir şekilde adlandırılmış yönteme benzeyen herhangi bir yöntemi yoktur; bu, başarısız çağrıda bir şekilde yanlış nesneye bir işaretçi kullanıldığı anlamına gelir.

Örneğin, şu yapılabilir:

NSArray* myArray = [myDictionary objectForKey:@"values"];
NSString* myString = [myArray objectAtIndex:5];

Ve şu satırlarda bir hata al:

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

çünkü nesne, myDictionary aslında bir NSDictionary idi, beklenen NSArray değildi.

Ne yazık ki en kafa karıştırıcı, bu tür bir hatanın kendi kodunuzdan ziyade UI sistem kodunda derinlerde meydana gelmesidir. Bu, bir sistem arayüzüne bir şekilde yanlış nesneyi aktardığınızda veya belki de Interface Builder'da veya herhangi bir yerde yanlış sınıfı yapılandırdığınızda olabilir.


6

Bir başka olası neden, orijinal nesnenin yok edilmiş olması ve ardından aynı bellek adresine başka bir nesnenin tahsis edilmiş olmasıdır. Daha sonra kodunuz mesajı gönderir, hala eski nesneye bir işaretçiye sahip olduğunu düşünür ve Objective-C bir istisna atar çünkü yeni nesne bu mesajı anlamaz.

Bu sorunu teşhis etmek için Profiler'ı 'Zombies' algılamasıyla çalıştırın.


2

Swift 5.0

Nesnenin belirli bir seçiciye yanıt verip vermediğini öğrenmek için Introspection'ı kullanabilirsiniz .

let canWork = yourObject.respondsToSelector(Selector("image"))   // true

Yalnızca kodun çalışacağı doğruysa .. aksi takdirde kesinlikle çökecektir


1

Bu senaryolarda iki şeye bakmayı yararlı buldum

  1. Çağrı yığını
  2. Her yığın çerçevesindeki yerel değişkenler (ve türleri)

Bu hatayı yaşadığımda, genellikle Tip B'yi beklerken A Tipi bir örneğe mesaj gönderdiğim için.

Bu özel senaryoda, bir üst sınıfın gereksinimini karşılamıyor olabilirsiniz (ItemTableViewCell örneğinizin büyük olasılıkla devraldığı göz önüne alındığında).

ItemTableViewCell sınıfınızın kodunu bize gösterebilir misiniz?


1

Değişkeni bildirmek için aşağıdaki kodu kullanabilirsiniz:

let noteListTableViewCellobject = "NoteListTableViewCell";` `// Note listTablecell create custom cell`

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    var cell:NoteListTableViewCell? = tableView.dequeueReusableCellWithIdentifier(noteListTableViewCellobject) as? NoteListTableViewCell

    if (cell == nil) {
        let nib:Array = NSBundle.mainBundle().loadNibNamed("NoteListTableViewCell", owner: self, options: nil)
        cell = nib[0] as? NoteListTableViewCell
    }
}

0

Aynı sorunu yaşadım ve bu benim için çalıştı:

SKScene'nizde isEqual'ı geçersiz kılın:

- (BOOL)isEqual:(id)other {

    if (![other isMemberOfClass:[SKScene class]]) {
        return false;
    }
    return [super isEqual:other];
}

0

indexPathTablo görünümü hücresinin nesnesini bildirmek için geçmelisiniz .

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    return cell
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.