2010-11-23 10 views
-2

ich die folgende Störung erhalten das Hintergrundbild auf den Inhalt einer Tabellenansicht Zelleimmer den Fehler [NSCFString setBackgroundImage: forState:]:

[NSCFString setBackgroundImage:forState:]: unrecognized selector sent to instance 

    UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
      playBtn.frame = CGRectMake(x+playBtnXPos, y+playBtnYPos, playBtnWidth, playBtnHeight); 
      [playBtn addTarget:self action:@selector(playBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; 
      if(playingButton && streamer){ 
       if(playingButtonTag == i && [streamer isPlaying]){ 
        [playBtn setBackgroundImage:[UIImage imageNamed:pauseBtnimgName] forState:UIControlStateNormal]; 
        playingButton = playBtn; 
       }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal]; 
      }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal]; 
      playBtn.tag = i; 

      [cell.contentView addSubview:playBtn]; 

..... 

kann mir jemand helfen ... beim Hinzufügen

dank ...

+0

-1. Sie scheinen den problematischen Code nicht zu zeigen. Ist das Hintergrundbild. Wo sonst wird "playingButton" verwendet? –

+0

Zwei Dinge: 1) Fügen Sie einige Leerzeichen hinzu. Es ist schwer zu lesen. Hilf uns, dir zu helfen. 2) Sagen Sie uns genau, auf welcher Linie es stürzt. Schau dir deine Stack-Spur an und es wird dir sagen. Hilf uns wieder, dir zu helfen. –

+0

es stürzt ab, während das Hintergrundbild auf die Schaltfläche gesetzt wird. – rockey

Antwort

3

Wenn Sie Speicherverwaltung Probleme haben (Selektoren an die falschen Instanzen gesendet wird, ist ein Zeichen von Speicher-Management-Themen), gibt es eine Reihe von Dingen, die Sie tun können:

  1. Re-lesen Sie die Cocoa memory management rules und vergewissere dich, dass du ihnen folgst.
  2. Führen Sie die static analyser. Dies wird oft Orte aufgreifen, an denen Sie die Speicherverwaltungsregeln vernachlässigt haben.
  3. Verwenden Sie NSZombieEnabled, um herauszufinden, ob [und wann] Nachrichten an nicht zugeordnete Instanzen gesendet werden.
+0

+1 für NSZombiesEnabled, was dazu führt, dass die Fehler sinnvoller werden. Es wäre jedoch noch nützlicher, wenn es Retain/Release-Protokollierung (wie Instrumente) hat. Es gibt MallocStackLogging, aber ich denke nicht, dass Tracks beibehalten/veröffentlicht werden. –

+0

Selektoren, die an falsche Instanzen gesendet werden, sind eher ein Zeichen dafür, dass sie an das falsche Objekt oder an fehlende Methoden gesendet werden. Normalerweise ist es EXC_BAD_ACCESS zum Senden von Nachrichten an nicht zugeordnete Instanzen. –

+0

@David Liu: Wenn ein Selektor an die falsche Instanz gesendet wurde, oft weil das ursprüngliche Objekt freigegeben wurde und stattdessen eine andere Instanz einer anderen Klasse zugewiesen wurde (was ein Speicherverwaltungsproblem ist). – dreamlax

-1

die Laufzeit ist es zu sagen: Sie versuchen, etwas in NSString zu nennen, die nicht, und ich weiß sicher nicht existieren, dass [NSCFString setBackgroundImage:forState:] existiert nicht, daher den Fehler und „möglicherweise“ ein Unfall. Der Compiler sollte Ihnen eine Warnung in Ihrem Quellcode anzeigen, in der Sie falsch liegen.

+1

Aber, wie Sie in seinem Code sehen können, verwendet er nicht die 'setBackgroundImage: forState:' Methode für eine Zeichenkette, er verwendet sie auf, was ein 'UIButton' sein soll. Plus, das ist kein Compilerfehler, es ist ein Laufzeitfehler, – dreamlax

+0

Ich erhalte diesen Fehler in der Konsole, während er abgestürzt ist ....- [NSCFString setBackgroundImage: forState:]: unerkannter Selektor gesendet an Instanz 0x6c39170 2010- 11-23 15: 19: 17.638 Yes.com [30281: 40b] *** Beenden von App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [NSCFString setBackgroundImage: forState:]: nicht erkannter Selektor an Instanz 0x6c39170' * ** Callstack beim ersten Wurf: – rockey

+0

Ich weiß, dass er es nicht tut. Er kann seine Klammern falsch haben. Er sollte es einfach durch den Debugger laufen lassen. – Pripyat