'인스턴스로 전송 된 인식 할 수없는 선택기'오류를 디버그하려면 어떻게해야합니까?
내 테이블보기에 대한 사용자 지정 테이블 셀보기를 만들고 있습니다. 사용자 지정 셀 (스토리 보드)의 이미지보기를 신속하게 코드에 연결하면 다음 오류가 발생합니다.
[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
)
이 오류를 해결하는 방법을 알려주시겠습니까?
감사합니다.
내 프로젝트에 예외 중단 점을 추가합니다.
이것이 끊어지는 선입니다.
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as ItemTableViewCell <---------------
하지만 내 코드에서 '이미지'를 사용하지 않습니다.
에서 기호 중단 점을 설정해보십시오 -[NSObject(NSObject) doesNotRecognizeSelector:]
. [+]
중단 점을 추가하려면 Breakpoint Navigator의 왼쪽 하단 모서리를 클릭하기 만하면 됩니다. 그런 다음 'Add Symbolic Breakpoint'를 클릭합니다. 지금 충돌을 재현하면 코드에서 문제가 발생한 위치를 더 잘 알 수 있습니다.
을 사용하여 이러한 충돌을 쉽게 추적 할 수 있습니다 Exception Breakpoints
.
열고 Breakpoint Navigator
추가
Once you add the Exception Breakpoint, option will be open to choose the Exception
.
Select Objective-C
.
Run the code and crash the application, breakpoint will stop you to the point where the code is crashing.
The critical first step is to analyze the error message:
[UITableViewCellContentView image]: unrecognized selector sent to instance
This tells you that the "message" image
was "sent" to an object of class UITableViewCellContentView. (In other words, an attempt was made to call the method image
on an object of class UITableViewCellContentView.)
The first thing to ask is "Does this make any sense at all?" It may be that the named class has an Image
method, but not an image
method, and so the wrong method name was used on the call. Or it may be that the named method is someMethod:someParm:
, but the class implements someMethod:someParm:anotherParm:
, meaning that a parameter was omitted on the call.
Most often, though, the named class does not have any method even vaguely resembling the named method, meaning that somehow a pointer to the wrong object was used in the failing call.
For instance, one might do:
NSArray* myArray = [myDictionary objectForKey:@"values"];
NSString* myString = [myArray objectAtIndex:5];
And get an error along the lines of:
[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance
because the object retrieved from myDictionary
was, in fact, an NSDictionary, not the NSArray that was expected.
Most confusing, unfortunately, is when this sort of error occurs deep in UI system code rather than in your own code. This can happen when you somehow passed the wrong object to a system interface, or perhaps configured the wrong class in Interface Builder or wherever.
Another possible reason is that the original object was destroyed and then another object was allocated at the same memory address. Then your code sends the message, thinking it still has a pointer to the old object, and Objective-C throws an exception because the new object doesn't understand that message.
To diagnose this problem, run the Profiler with 'Zombies' detection.
In these scenarios I've found it helpful to look at two things
- The call-stack
- The local variables (and their types) at each stack frame
When I've had this error, it's usually because I sent a message to an instance of Type A, when I was expecting Type B.
In this specific scenario, you may not be satisfying a requirement of a parent class (given your instance of ItemTableViewCell most likely inherits).
Can you maybe show us the code for your ItemTableViewCell class?
You can use the following code to declare the variable:
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
}
}
You can use Introspection to find out whether object responds to a particular selector or not..
let canWork = yourObject.respondsToSelector(Selector("image")) // true
Only if it is true that code will work.. otherwise it will crash for sure
I had the same problem, and this worked for me:
Override the isEqual in your SKScene:
- (BOOL)isEqual:(id)other {
if (![other isMemberOfClass:[SKScene class]]) {
return false;
}
return [super isEqual:other];
}
You have to pass indexPath
to declare object of tableview cell.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
return cell
}
'programing tip' 카테고리의 다른 글
ASP.NET MVC Razor : 컨트롤러 작업 내에서 Razor 부분보기의 HTML을 렌더링하는 방법 (0) | 2020.08.22 |
---|---|
자바 스크립트에서 배열의 최대 크기 (0) | 2020.08.22 |
Angular2 오류 : "exportAs"가 "ngForm"으로 설정된 지시문이 없습니다. (0) | 2020.08.22 |
출력이 파일로 리디렉션 될 때 printf () 및 system ()의 결과가 잘못된 순서로 표시됨 [중복] (0) | 2020.08.22 |
죄와 cos를 함께 계산하는 가장 빠른 방법은 무엇입니까? (0) | 2020.08.22 |