ভিউকন্ট্রোলার প্রতিক্রিয়া জানিয়েছে টো সিলেক্টর: বার্তাটি ডিওলোকটেড ইনস্ট্যান্সে পাঠানো হয়েছে (ক্র্যাশ)


95

ঠিক আছে, এখানে চুক্তিটি রয়েছে, আমি আমার ডিবাগিং এবং ক্র্যাশগুলি সম্পর্কে প্রশ্ন করা ঘৃণা করি। কারণ আমি সাধারণত এগুলি নিজেই পরিচালনা করি তবে ইতিমধ্যে একাধিক প্রশ্ন দেখার পরেও আমি কেবল এটিকে ঘিরে ধরতে পারি না

ঠিক আছে তাই এখানে সমস্যা, আমি আমার অ্যাপটি এলোমেলোভাবে এই স্ট্যাক ট্রেসের সাথে ক্র্যাশ করে এবং বন্ধ করে খুঁজে পাই:

*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0

কোথায় ViewControllerপরিবর্তিত হতে পারে, কখনও কখনও যেখানে আমার কোডটি ক্র্যাশ হয় সেই জায়গার কোনও নির্দিষ্টটির সাথে কোনও প্রাসঙ্গিকতা ViewControllerনেই এবং এটির মালিকানা বা কল নেই।

এছাড়াও, এই কনসোলের সন্ধান পেতে, আমি জম্বিগুলি সক্ষম করেছি, অন্যথায় আমি কোনও কনসোল মুদ্রণ পাব না, আমি কেবল পেয়ে objc_msgSendযাব : যার অর্থ আমি জানি যে আমি মুক্তিপ্রাপ্ত এমন কিছু বার্তা দিচ্ছি। কিন্তু আমি কোথায় তা পাই না ... আমি সত্যিই আটকে আছি! সাধারণত আমি সর্বদা আমার ক্র্যাশগুলি ডিবাগ করি, তাই আমি সত্যিই এতে আটকে থাকি।

আবার, বিভিন্ন সময়ে বিভিন্ন সময়ে, চালু এবং বন্ধে এই ক্রাশ হয়। এবং যে স্থানটি এটি ক্র্যাশ করেছে তার সাথে প্রায় কোনও প্রাসঙ্গিকতা নেইViewController । এবং আমি এটি খুব বিভ্রান্তিকর মনে।

আপনার কি আমার কোনও কোড দরকার? আমার প্রচুর ফাইল রয়েছে এবং যেহেতু এটি বিভিন্ন স্থানে ক্রাশ হচ্ছে, তাই আমার কোড বিতরণ করা গোলযোগ হবে!

আমি ভাগ্য ছাড়াই প্রতীকী ব্রেকপয়েন্টগুলি যুক্ত করার চেষ্টা করেছি এবং আইওএসের জন্য ইনস্ট্রুমেন্টস অ্যাপ্লিকেশনটিতে জম্বিগুলি উপলব্ধ নেই। আমি সিমুলেটরটিতে আমার অ্যাপটি চালাতে পারি না কারণ এতে এর জন্য অসমর্থিত আর্কিটেকচার ফ্রেমওয়ার্ক রয়েছে।

ধন্যবাদ সবাইকে...


আপনি কি এই প্রশ্নটির দিকে নজর রেখেছেন
স্ব

আপনার ধারণাগুলিতে রূপান্তর করার পদ্ধতিটি সামঞ্জস্যপূর্ণ বলে ধরে নিচ্ছেন, সম্ভবত আপনি আমাদের একটি বা দুটি উদাহরণ দেখাতে পারেন। আপনি যদি স্ট্যান্ডার্ড পুশ / প্রেজেন্টভিউ কনট্রোলার করে থাকেন তবে আপনাকে ভাল হওয়া উচিত, তবে আমি এখানে প্রচুর লোককে ভিউ কন্ট্রোলার বরাদ্দ করা / শুরু করার মতো কাজগুলি করতে দেখছি, কিন্তু তারপরে একটি পুশ / উপস্থিতি না করে বরং কন্ট্রোলারের কেবল যুক্ত করা হচ্ছে একটি মতামত হিসাবে দেখুন। শুধু একটি এলোমেলো উদাহরণ। তবে আমরা কিছু কোড ছাড়াই এটি নির্ণয় করতে পারি না। আশা করি কয়েকটি স্নিপেটগুলি কী ঘটছে তা নির্ধারণ করতে আমাদের সহায়তা করবে, তাই আসুন দেখুন।
রব

প্রতীকী ব্রেকপয়েন্টগুলি সক্ষম করার বিষয়ে কীভাবে? এগুলি যুক্ত করার চেষ্টা করুন: wiki.zemingo.com/index.php?title=Symbolic_BreakpPoint
স্তাবশ

@ রবার্টরিয়ান আমি বর্তমানের মডেলভিউ কনট্রোলার ব্যবহার করি, আমি এটিকে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করি না
এমসিকেপুর

আমার ক্ষেত্রে, আমার চাইল্ড ভিউ কন্ট্রোলারে একটি ওয়েবভিউ রয়েছে এবং শিশু ভিসি ওয়েবভিউয়ের স্ক্রোলভিউয়ের প্রতিনিধি ছিলেন। ডেলোক / ভিউউইলডিস্পিয়ারের সময় আমাকে প্রতিনিধিদের রেফারেন্সটি ম্যানুয়ালি সরানো দরকার ছিল অথবা আমি এই ক্র্যাশ পেয়েছি। আশা করি এটি কাউকে সাহায্য করবে।
ডার্মোট

উত্তর:


169

ব্যবহারের ইনস্ট্রুমেন্ট deallocated উদাহরণস্বরূপ ত্রুটি খুঁজিয়া বাহির করা। আপনার অ্যাপ্লিকেশনটিকে ( Cmd ⌘+ I) প্রোফাইল দিন এবং জম্বি টেম্পলেট চয়ন করুন । আপনার অ্যাপ্লিকেশন চলার পরে, এটি ক্রাশ করার চেষ্টা করুন। আপনার এমন কিছু পাওয়া উচিত:

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

পপওভারে ঠিকানার পাশের তীরটিতে ক্লিক করুন যে বস্তুটি নামিয়ে দেওয়ার পরে ডেকে আনা হয়েছিল show

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

আপনার এখন প্রতিটি কল দেখতে পাওয়া উচিত যা এই অবজেক্টের রক্ষণ গণনা পরিবর্তন করেছে। এটি হতে পারে কারণ সরাসরি রক্ষণ / প্রকাশের বার্তা প্রেরণের পাশাপাশি অটোরিলেজ পুলগুলি শুকিয়ে যাওয়া বা এনএসএরাইতে প্রবেশ করানো।

রেফসিটি কলামটি কর্ম শুরু হওয়ার পরে ধরে রাখা গণনা দেখায় এবং দায়িত্বশীল কলার শ্রেণীর নাম এবং পদ্ধতিটি দেখায় যা এটি সম্পাদিত হয়েছিল। আপনি যখন কোনও রক্ষণ / প্রকাশের উপর ডাবল ক্লিক করেন, যন্ত্রগুলি আপনাকে কোথায় সম্পাদিত হয়েছিল কোডের লাইনটি প্রদর্শন করবে (এটি যদি কাজ না করে তবে আপনি কলটি এটি নির্বাচন করে এবং এর প্রসারিত বর্ধিত বিশদ ফলকে চয়ন করে পরীক্ষা করতে পারেন ):

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

এটি আপনাকে অবজেক্টের সমস্ত রিটেনকাউন্টের জীবনচক্র পরীক্ষা করতে দেয় এবং সম্ভবত আপনি এখনই আপনার সমস্যাটি খুঁজে পাবেন। আপনাকে যা করতে হবে তা হ'ল সর্বশেষতম প্রকাশের জন্য অনুপস্থিত রক্ষা পাওয়া


4
releaseবিশেষত সমস্যাটি সর্বশেষতম নাও হতে পারে । সমস্যাটি কোনও ভারসাম্যহীন releaseretainআপনি কেবলমাত্র এমন কিছুতে ব্যর্থ হয়ে উঠতে পারেন যা আপনি পয়েন্টার রেখেছেন এবং পরে উল্লেখ করছেন।
কেন থমাসেস

4
এছাড়াও, আমার কাছে কোনও জুম্বো যন্ত্রের টেম্পলেট নেই, কারণ এটি আমি Xcode Beta 4.5 ব্যবহার করছি, আমি এর মধ্যে 4.4 এ চলে যাব
MCKapur

4
ওহ, জম্বিগুলি কেবল আইওএস সিমুলেটারে সরবরাহ করা হয়। আমি আইওএস সিমুলেটরে চালাতে পারি না, ব্যবহৃত কিছু ফ্রেমওয়ার্ক এবং গ্রন্থাগারগুলি আর্কিটেকচার সমর্থন করে না
এমসিকেপুর

শুধু একটি ছোট নোট। এটি এক্সকোড ৫-এ নতুন যা থেকে এসেছে তা থেকে "" এক্সকোড ৫-এ জম্বি ইনস্ট্রুমেন্ট টেম্পলেটটি বাড়ানো হয়েছে এবং এখন ডিভাইসগুলিতে ব্যবহার সমর্থন করে devices এই নোটটি আপনার কাছে আমার এবং আমার মূল্যবান সময়ের 2 ঘন্টা নিয়ে এসেছিল ...
নিকফক্স

4
আমাদের অ্যাপটি ক্রাশ হওয়া বন্ধ করে দেয় এবং যদি আমরা এই যন্ত্রটির সাথে এটি আঁকছি তখন কোনও "বিঘ্নিত উদাহরণটিতে পাঠানো বার্তা" ত্রুটি দেওয়া বন্ধ করে দিলে এর অর্থ কী ? (রোগীর "ডায়াগনস্টিক পরীক্ষা করা হলে" রোগটি "অদৃশ্য হয়ে যায়)
প্রক্সাইটেলস

59

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

 self.navigationController.delegate = self;

ক্র্যাশটি ঘটে যখন সেই নিয়ামককে বিলোপযুক্ত করা হয়েছিল তবে দেখা নিয়ামকের জন্য এখনও প্রতিনিধি ছিলেন। Dealloc এ এই কোডটি যুক্ত করার কোনও প্রভাব ছিল না:

-(void) dealloc
{
    if (self.navigationController.delegate == self)
    {
        self.navigationController.delegate = nil;
    }

কারণ ডেলালোক বলা হয় এমন সময়ে, ভিউ কন্ট্রোলারটি ইতিমধ্যে ভিউ হায়ারার্কি থেকে সরিয়ে ফেলা হয়েছে, সুতরাং সেলফ ন্যাভিগেশন কন্ট্রোলার শূন্য, সুতরাং তুলনা ব্যর্থ হওয়ার নিশ্চয়তা! :-(

সমাধানটি ছিল কোডটি ভিউ হায়ারার্কিটি আসলে এটি করার আগেই সনাক্ত করার জন্য এটি কোড যুক্ত করা। এটি আইওএস 5 এ প্রবর্তিত একটি পদ্ধতি ব্যবহার করে যখন ভিউটি পপ করা হয় এবং ধাক্কা না দেওয়া হয় তা নির্ধারণ করতে

-(void) viewWillDisappear:(BOOL) animated
{  
   [super viewWillDisappear:animated];
   if ([self isMovingFromParentViewController])
   {
      if (self.navigationController.delegate == self)
      {
           self.navigationController.delegate = nil;
      }
   }
}

আর ক্র্যাশ নেই!


আমাকেও ধন্যবাদ - এই পোস্টটি সন্ধানের জন্য মাত্র 4 ঘন্টা অনুসন্ধানের প্রয়োজন।
দাইদাই

পোস্ট করার জন্য ধন্যবাদ, একই সমস্যা ছিল ^^
টায়রন

আপনি কীভাবে এই জাতীয় বিরক্তিকর সমস্যার সমাধান পেতে পারেন? সালাম জানানো !!
ভিরুম্যাক্স

4

যে কেউ এর সমাধান করতে পারে না তাদের জন্য এখানে আরও কিছু কৌশল রয়েছে:

https://stackoverflow.com/a/12264647/539149

https://stackoverflow.com/a/5698635/539149

https://stackoverflow.com/a/9359792/539149

https://stackoverflow.com/a/15270549/539149

https://stackoverflow.com/a/12098735/539149

আপনি প্রকল্পের পপআপ-> প্রকল্প সম্পাদনা করুন ... প্রোফাইল -> ইনস্ট্রুমেন্টটি ক্লিক করে এক্সকোড 5 এ ইনস্ট্রুমেন্টগুলি চালনা করতে পারেন এবং বরাদ্দ বা লিকগুলি বেছে নিতে পারেন, তারপরে আপনার অ্যাপ্লিকেশনটির প্রোফাইল দিন, তারপরে সরঞ্জামগুলি বন্ধ করুন, বরাদ্দগুলির ইনফরমেশন বোতামটি ক্লিক করুন এবং "এনএসজেম্বি সনাক্তকরণ সক্ষম করুন" ।

তবে, সরাসরি com.apple.main- থ্রেড থেকে আসা বার্তাগুলির জন্য, এটি সম্ভবত কিছুই প্রকাশ করবে না।

আমি এটিতে আমার মাথাটি প্রায় দুই ঘণ্টার জন্য বেঁধে দিয়েছিলাম এবং উত্তরটি একটি অতিরিক্ত ওষুধ হিসাবে প্রমাণিত হয়েছিল, যা আমি অপরাধীর সন্ধান না হওয়া পর্যন্ত আমার প্রকল্পের একটি অনুলিপি মন্তব্য করে আবিষ্কার করেছিলাম:

[viewController release];
viewController = NULL;

সমস্যাটি হ'ল রিলিজটি NUL তে ভেরিয়েবল সেট করে না।

এর অর্থ হল এটি পুনরায় রিলিজ রিলিজ করে, পুনরায় গণনা হ্রাস করে এবং তত্ক্ষণাত মেমরিটি মুক্ত করে যখন রেফারেন্স ভিউ কন্ট্রোলারটির সাথে ভেরিয়েবলগুলি সমাপ্ত হয় তার অর্থ এটি।

সুতরাং হয় আরসি সক্ষম করুন বা নিশ্চিত করুন যে আপনার প্রকল্প ধারাবাহিকভাবে রিলিজ বা NUL ব্যবহার করেছে তবে দুটোই নয়। আমার পছন্দটি নুল ব্যবহার করা কারণ কারণ তখন কোনও জম্বি রেফারেন্সের কোনও সুযোগ নেই তবে এটি কোথায় অনুসন্ধান করতে পারে যেখানে বস্তুগুলিকে আরও কঠিন করা হয়।


4

আমি গতকাল আইওএস-এ একই সমস্যার মুখোমুখি হয়েছিলাম। আমি অ্যাপটি "সম্পর্কে" সাবভিউতে আইএপি তৈরি করেছি এবং আমি "সম্পর্কে" ভিউডিডলয়েডে লেনদেন পর্যবেক্ষক যুক্ত করেছি। আমি যখন প্রথমবারের জন্য কেনলাম তখন কোনও সমস্যা নেই, তবে আমি মূল উইন্ডোতে ফিরে এসে আবার কেনার জন্য পর্যালোচনাটি প্রবেশ করার পরে, সমস্যাটি "মীমাংসিত উদাহরণটিতে পাঠানো বার্তা" ঘটেছে এবং অ্যাপটি ক্র্যাশ হয়ে গেছে।

- (void)viewDidLoad
{
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];                                           object:nil];
}

আমি Dealloc এ লেনদেন পর্যবেক্ষক অপসারণ করার পরে, সমস্যাটি সমাধান করা হয়।

- (void)dealloc
{
    // Even though we are using ARC, we still need to manually stop observing any
    // NSNotificationCenter notifications.  Otherwise we could get "zombie" crashes when
    // NSNotificationCenter tries to notify us after our -dealloc finished.

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

এটি আমার রানটাইম ক্র্যাশটিকে স্থির করেছে ... আমি zombieঅ্যাপ অ্যাপ্লিকেশন কেনার জন্য বস্তু পেয়েছিলাম। অনেক ঘন্টা খনন করার পরে আমি এটি পেয়েছি .... একজন বড় ধন্যবাদ ম্যান।
মহেন্দ্র

4

আমার খুব অনুরূপ সমস্যা ছিল এবং আমি বুঝতে পেরেছিলাম এটি নেভিগেশন কন্ট্রোলার প্রতিনিধিরা সেট করার কারণে।

নীচে আমার সমস্যা সমাধান করেছে,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if (self.navigationController.delegate != self) {
        self.navigationController.delegate = self;
    }
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.delegate == self) {
        self.navigationController.delegate = nil;
    }
}

ধন্যবাদ !! এখানেও একই সমস্যা ছিল।
পেগপেগ

2

ওএস এক্সেও একই সমস্যা ছিল

- (void)dealloc@ সফটওয়্যারভলভড ইতিমধ্যে বলেছে হিসাবে এটি পর্যাপ্ত নয় এর সমাধান করার জন্য । তবে দুর্ভাগ্যক্রমে - (void)viewWillDisappearকেবলমাত্র ১০.১০ সংস্করণে এবং পরে পাওয়া যায়।

আমি আমার এনএসভিউকন্ট্রোলার সাবক্লাসে কাস্টম পদ্ধতি প্রবর্তন করেছি যেখানে সমস্ত জম্বি-বিপজ্জনক রেফারেন্স নির্ধারণ করে। আমার ক্ষেত্রে এটি ছিল NSTableViewবৈশিষ্ট্য ( delegateএবং dataSource)।

- (void)shutdown
{
  self.tableView.delegate = nil;
  self.tableView.dataSource = nil;
}

এখানেই শেষ. প্রতিবার যখন আমি সুপারভিউ থেকে ভিউ সরিয়ে ফেলছি তখন এই পদ্ধতিটি কল করতে হবে।


2

আমার একই সমস্যা ছিল which কোন প্রতিনিধি কারণ ইস্যুটি খুঁজে পাওয়া মুশকিল, কারণ এটি কোনও লাইন বা কোড বিবৃতি নির্দেশ করে না তাই আমি কিছুটা চেষ্টা করেছি, সম্ভবত এটি আপনার পক্ষে সহায়ক হয়ে উঠবে।

  1. এক্সিব ফাইলটি খুলুন এবং ফাইলের মালিক থেকে ডান হাতের মেনুটি "সংযোগ পরিদর্শক দেখান" নির্বাচন করুন। প্রতিনিধিদের তালিকাভুক্ত করা হয়, সন্দেহজনক যে এগুলি শূন্য করতে সেট করুন।
  2. (আমার ক্ষেত্রে একই) টেক্সটফিল্ডের মতো প্রপার্টি অবজেক্ট ইস্যু তৈরি করতে পারে, সুতরাং এর প্রতিনিধিদের শুন্যে সেট করুন।
-(void) viewWillDisappear:(BOOL) animated{

[super viewWillDisappear:animated];

if ([self isMovingFromParentViewController]){

self.countryTextField.delegate = nil;

self.stateTextField.delegate = nil;

}

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