কীভাবে আমি 'ত্রুটিবিহীন নির্বাচককে উদাহরণ হিসাবে পাঠানো হয়েছে' ত্রুটি ডিবাগ করতে পারি


100

আমি আমার টেবিল দেখার জন্য একটি কাস্টম টেবিল সেল ভিউ তৈরি করছি। আমি কাস্টম সেল (স্টোরিবোর্ডে) এর কোনও চিত্র ভিউটি আমার কোডে সুইফটে সংযুক্ত করার পরে, আমি নিম্নলিখিত ত্রুটিটি পেয়েছি।

[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  <---------------

তবে আমি আমার কোডে 'চিত্র' ব্যবহার করি না।


2
আপনি image]কোথাও ফোন করছেন .. তবে ভুল বস্তুতে। ত্রুটির প্রথম লাইন আপনাকে অনেক কিছু বলে
ccwasden

1
ইউআইটিএবলভিউসেলকন্টেন্টভিউতে [চিত্র] কল করা বন্ধ করুন - এটি এটি ঠিক করে দেবে। আমাদের কোডটি দেখান যা এই ক্রাশের কারণ হয়ে দাঁড়িয়েছে।
গ্রেজগোর্জ ক্রোকোভস্কি

1
আমি মনে করি আপনি টেবিলভিউসেলটিতে কিছু চিত্র ব্যবহার করেছেন তবে সেই চিত্রটি আপনার বান্ডলে নাও থাকতে পারে।
নন্দ পরিক

উত্তর:


102

প্রতীকী ব্রেকপয়েন্টটি সেট করার চেষ্টা করুন -[NSObject(NSObject) doesNotRecognizeSelector:]। কেবল ক্লিক করুন [+]ব্রেকপয়েন্ট ন্যাভিগেটর নীচের অংশে বাম কোণে একটি ব্রেকপয়েন্ট যোগ করতে। তারপরে 'সিম্বলিক ব্রেকপয়েন্ট যুক্ত করুন' ক্লিক করুন। আপনার ক্র্যাশকে এখনই পুনঃনির্মাণের মাধ্যমে আপনার কোডে সমস্যাটি কোথায় ঘটে সে সম্পর্কে আপনাকে আরও ভাল ধারণা দেওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন


17
কেবল একটি ব্যতিক্রম ব্রেকপয়েন্টও যোগ করতে পারে ।
rebello95

1
আমার দিন বাঁচিয়েছে, ভাই।
এন্টিমোরন

1
ধন্যবাদ এটি এত দরকারী
মোহাম্মদ সধাম

35

আপনি সহজেই এই জাতীয় ক্রাশ ব্যবহার করে ট্র্যাক করতে পারেন Exception Breakpoints

খুলুন Breakpoint Navigatorএবং যোগ করুন

এখানে চিত্র বর্ণনা লিখুন

আপনি একবার ব্যতিক্রম ব্রেকপয়েন্ট যুক্ত করলে বিকল্পটি চয়ন করার জন্য খোলা থাকবে Exception

এখানে চিত্র বর্ণনা লিখুন

নির্বাচন করুন Objective-C

কোডটি চালান এবং অ্যাপ্লিকেশন ক্র্যাশ করুন, ব্রেকপয়েন্ট আপনাকে সেই পয়েন্টে থামিয়ে দেবে যেখানে কোড ক্রাশ হচ্ছে।


এটি AppDelegate লাইনে 1 হয়। এখন কি? :(
ড্যানিয়েল স্প্রিংগার

আপনি অ্যাপডেলিগেটে লিখিত আপনার কিছু কোড প্রদর্শন করতে পারেন? যেখানে ব্রেকপয়েন্টটি থামছে। এবং লগগুলি পাশাপাশি।
ভাতসাল কে

এটি লাইন 1 এ বিরতি দেয়, যেখানে অ্যাপের প্রতিনিধি ঘোষণা করা হয়
ড্যানিয়েল স্প্রিংগার

কিছু ফ্রেমওয়ার্কের কারণে এটি থেমে আছে এমন কিছু ক্ষেত্রে রয়েছে তবে অ্যাপ্লিকেশনটি চালানোর জন্য আপনাকে 3-4 বারের জন্য চালিয়ে যাওয়া বোতামটি চাপতে হতে পারে তা নিয়ে চিন্তা করবেন না।
ভাতসাল কে

এ জাতীয় ক্ষেত্রে এটি ত্রুটি নয়, কিছু পুরানো ফ্রেমওয়ার্কগুলি এ জাতীয় সমস্যা তৈরি করে। আপনার পুরানো ফ্রেমওয়ার্কগুলি নতুন / আপডেট হওয়াতে আপডেট করে চেষ্টা করুন। এটি সমস্যার সমাধান করা উচিত।
ভাতসাল কে

30

গুরুতর প্রথম পদক্ষেপটি ত্রুটি বার্তাটি বিশ্লেষণ করা:

[UITableViewCellContentView image]: unrecognized selector sent to instance

এটি আপনাকে বলবে যে "বার্তা" imageটিআইটিআইটিবেল ভিউসেলকন্টেন্টভিউ শ্রেণীর কোনও অবজেক্টে "প্রেরণ" হয়েছিল। (অন্য কথায়, imageইউআইটিএবলভিউসকেল কনটেন্টভিউ ক্লাসের কোনও অবজেক্টে পদ্ধতিটি কল করার চেষ্টা করা হয়েছিল ।)

জিজ্ঞাসা করার প্রথম জিনিসটি "এটি কি আদৌ কোনও অর্থবোধ করে?" এটি হতে পারে যে নামযুক্ত শ্রেণীর একটি Imageপদ্ধতি রয়েছে তবে কোনও পদ্ধতি নয় imageএবং তাই কলটিতে ভুল পদ্ধতির নামটি ব্যবহৃত হয়েছিল। অথবা এটি হতে পারে যে নামযুক্ত পদ্ধতিটি রয়েছে someMethod:someParm:তবে শ্রেণি প্রয়োগ করে someMethod:someParm:anotherParm:, যার অর্থ কলটিতে একটি পরামিতি বাদ দেওয়া হয়েছিল।

বেশিরভাগ ক্ষেত্রে, যদিও, নামযুক্ত শ্রেণীর কোনও পদ্ধতিও অস্পষ্টভাবে নামকরণ পদ্ধতিটির সাথে সাদৃশ্যযুক্ত হয় না, যার অর্থ ব্যর্থ কলটিতে কোনওভাবে ভুল বস্তুটির পয়েন্টার ব্যবহৃত হয়েছিল।

উদাহরণস্বরূপ, কেউ এটি করতে পারে:

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

এবং এর লাইনে একটি ত্রুটি পান:

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

কারণ বস্তুটি পুনরুদ্ধার করা myDictionaryআসলে একটি এনএসডি অভিধান ছিল, এনএসআর্রে নয় যা প্রত্যাশিত ছিল।

সবচেয়ে বিভ্রান্তিকর, দুর্ভাগ্যক্রমে, যখন এই জাতীয় ত্রুটিটি আপনার নিজের কোডের চেয়ে ইউআই সিস্টেম কোডের গভীরে ঘটে। এটি তখন ঘটতে পারে যখন আপনি কোনওভাবে কোনও সিস্টেমের ইন্টারফেসে ভুল অবজেক্টটি পাস করেছেন, বা সম্ভবত ইন্টারফেস বিল্ডারে বা যেখানেই ভুল ক্লাসটি কনফিগার করেছেন।


6

আর একটি সম্ভাব্য কারণ হ'ল আসল অবজেক্টটি ধ্বংস হয়ে গিয়েছিল এবং তারপরে একই জিনিসটির ঠিকানায় অন্য একটি বস্তু বরাদ্দ দেওয়া হয়েছিল। তারপরে আপনার কোডটি বার্তাটি প্রেরণ করে, এটি ভেবে এখনও পুরানো অবজেক্টের কাছে একটি পয়েন্টার রয়েছে এবং উদ্দেশ্য-সি একটি ব্যতিক্রম ছুঁড়েছে কারণ নতুন বস্তু সেই বার্তাটি বুঝতে পারে না।

এই সমস্যাটি নির্ণয়ের জন্য, 'জোম্বি' সনাক্তকরণের সাথে প্রোফাইলার চালান।


2

সুইফ্ট 5.0

নির্দিষ্ট নির্বাচককে বস্তু প্রতিক্রিয়া জানায় কি না তা জানতে আপনি ইনট্রোস্পেকশন ব্যবহার করতে পারেন ..

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

যদি এটি সত্য হয় তবেই কোডটি কাজ করবে .. অন্যথায় এটি অবশ্যই ক্র্যাশ হয়ে যাবে


1

এই পরিস্থিতিতে আমি দুটি জিনিস দেখার পক্ষে সাহায্যকারী পেয়েছি

  1. কল-স্ট্যাক
  2. প্রতিটি স্ট্যাক ফ্রেমে স্থানীয় ভেরিয়েবল (এবং তাদের ধরণ)

যখন আমার এই ত্রুটি হয়েছিল তখন এটি সাধারণত কারণ আমি টাইপ এ এর ​​একটি উদাহরণটিতে একটি বার্তা পাঠিয়েছিলাম, যখন আমি টাইপ বি প্রত্যাশা করছিলাম when

এই নির্দিষ্ট দৃশ্যে, আপনি পিতামাতাদের ক্লাসের প্রয়োজনীয়তা সন্তুষ্ট করছেন না (আইটেমটেবলভিউসেল সম্ভবত আপনার উত্তরাধিকার হিসাবে দেওয়া হয়েছে)।

আপনি কি আমাদের আইটেম টেবিলভিউসেল ক্লাসের কোডটি প্রদর্শন করতে পারেন?


1

ভেরিয়েবল ঘোষণার জন্য আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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

আমারও একই সমস্যা ছিল এবং এটি আমার পক্ষে কাজ করেছে:

আপনার এসকেসিনে আইসুয়ালকে ওভাররাইড করুন:

- (BOOL)isEqual:(id)other {

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

0

indexPathটেবিলভিউ ঘরের অবজেক্টটি ঘোষণার জন্য আপনাকে পাস করতে হবে।

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

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

    return cell
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.