কেভিও এবং এআরসি কীভাবে ওভারসভারটি সরান


87

আপনি কীভাবে কোনও এআরসি-র অধীনে কোনও পর্যবেক্ষককে সরিয়ে ফেলবেন ? আমরা কি কেবল পর্যবেক্ষক যুক্ত করব এবং এটি অপসারণ করতে ভুলে যাব? আমরা যদি আর ম্যানুয়ালি মেমরি পরিচালনা করি না তবে আমরা পর্যবেক্ষণ থেকে পদত্যাগ করব কোথায়?

উদাহরণস্বরূপ, একটি ভিউ কন্ট্রোলারে:

[self.view addObserver:self
            forKeyPath:@"self.frame"
               options:NSKeyValueObservingOptionNew 
               context:nil];

পূর্বে, আমি removeObserver:ভিউ কন্ট্রোলারের deallocপদ্ধতিতে কল করব ।


4
মনে রাখবেন কেভিও। ফ্রেম এর কাছে এটি খুব খারাপ ধারণা। স্ট্যাকওভারফ্লোতে অ্যাপল ইঞ্জিনিয়ারদের লেখা অন্য কোনও হিসাবে, ইউআইকিটের ফ্রেম সম্পত্তি কেভিও অনুসারে নয়। যখন এটি কাজ করে, কেবল খাঁটি সুযোগ দ্বারা।
স্টিপেটে

4
আপনার কীপথটি @"frame"বরং হওয়া উচিত নয় @"self.frame"?
বেসি

উত্তর:


126

আপনি এখনও -deallocএআরসি এর আওতায় বাস্তবায়ন করতে পারেন যা মূল মানগুলির পর্যবেক্ষণ অপসারণের উপযুক্ত জায়গা বলে মনে হয়। আপনি কেবল [super dealloc]এই পদ্ধতির মধ্যে থেকে আর কল করবেন না ।

আপনি যদি -releaseআগে ওভাররাইড করে থাকেন তবে আপনি জিনিসগুলি ভুল উপায়ে করছিলেন।


4
আপনি যদি এই বিষয়ে নিশ্চিত? আমি clang.llvm.org/docs/… , বিভাগ 7.1.2 থেকে উদ্ধৃত করছি । dealloc: "যুক্তিযুক্ত: যদিও এআরসি উদাহরণস্বরূপ ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে বিনষ্ট করে, তবুও একটি ডেলোক পদ্ধতি লিখতে বৈধ কারণ রয়েছে যেমন অ-ধরে রাখা যায় না এমন সম্পদ মুক্ত করা such এই জাতীয় পদ্ধতিতে [সুপার ডেলোক] কল করতে ব্যর্থ হওয়া প্রায়শই একটি বাগ is"
এলিস ভ্যান লুইজ

@ এলিজিভেনলুইজ হ্যাঁ এটি সত্য। আপনি যদি এই শ্রেণি থেকে উদ্ভূত হন তবে স্পষ্টভাবে মনে হয় যে আপনাকে অবশ্যই কল করতে হবে [super dealloc]। আর কে আপনার জন্য এই কাজ করা উচিত।
বুজরান ল্যান্ডম্যাসার

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

17
@ এলিজিভেনলুইজ - ম্যানুয়াল মেমোরি ম্যানেজমেন্ট কেস সম্পর্কিত তারা যে বিষয়টির চেষ্টা করছিল তা হল। এই [super dealloc]পদ্ধতিতে শেষ কল না করা ম্যানুয়াল মেমরি পরিচালনার অধীনে সর্বদা একটি বাগ থাকায় কম্পাইলারটি এখন আপনার জন্য এটি পরিচালনা করে, যার কারণে আপনি -deallocআর সরাসরি কল করতে পারবেন না । আপনি -deallocআরসি এর অধীনে কোনও পদ্ধতিতে রেখেছেন এমন কোনও অ-অবজেক্ট রিসোর্স যা আপনাকে মুক্ত করতে হবে বা পর্যবেক্ষকদের অপসারণের মতো ক্লিনআপ কাজগুলি। তারা যে শব্দটি ব্যবহার করেন তা হ'ল কিছুটা ঘোলাটে, তবে এটিই তাদের অর্থ।
ব্র্যাড লারসন

7
@ বিজার্ন মিল্কে - আমি যেমন এলিসের উত্তরে মন্তব্য করেছি, -finalizeআবর্জনা সংগ্রহের অধীনে -deallocএটির জন্য ব্যবহৃত হয়, যেখানে কখনই ডাকা হয় না, তবে এটি এইআরসি-র আওতায় রেখে এই কোডটি পুরোপুরি গ্রহণযোগ্য -dealloc[super dealloc]আপনার জন্য স্বয়ংক্রিয়ভাবে কল করা হয়, এজন্য এআরসি এর অধীনে এটি কল করা একটি ত্রুটি।
ব্র্যাড লারসন

1

আমি এই কোড দিয়ে এটি না

- (void)dealloc
{
@try{
    [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil];
} @catch(id anException) {
    //do nothing, obviously it wasn't attached because an exception was thrown
}
}    

4
ব্যতিক্রম হ্যান্ডলিং এর বিন্দু কি dealloc? এটি সম্পর্কে কিছু করতে দেরি হয়ে গেছে।
আবিজার্ন

ডেলোকের ক্ষেত্রে একটি উদাহরণ পরিবর্তনশীল পর্যবেক্ষকদের অপসারণের বিন্দুটি কী? এই ইউআভাটারআইমেজটি যে কোনও পর্যবেক্ষক যেমন এর মূল পথে সাবস্ক্রাইব করেছে তাদের সাথে সাথে তা শীঘ্রই বাতিল করা হবে।
shoumikhin

4
@ শৌমিখিন আমি এআরসি ব্যবহার করছি এবং আমাকে পর্যবেক্ষককে ডেলোক পদ্ধতিতে অপসারণ করতে হবে। আমার আপনার একই প্রশ্ন আছে। যাইহোক, যখন আমি ক্লাসের একাধিক উদাহরণ দৌড়াদৌড়ি করি অবশেষে আমি exc_bad_address ত্রুটি পেয়েছি। এটি করার ফলে সমস্যার সমাধান হয়েছে। এছাড়াও, এখান থেকে উত্তর stackoverflow.com/questions/32490808/… আমাকে সমস্যাটি আবিষ্কার করতে সহায়তা করেছে।
mac10688

-2

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


13
লক্ষ্য করুন যে তিনি সেখানে আবর্জনা সংগ্রহের কথা উল্লেখ করেছিলেন, এআরসি নয় (তাঁর উত্তরটি ২০০৮ সালে লেখা হয়েছিল)। আবর্জনা সংগ্রহের অধীনে, -deallocকখনও বলা হয় না। এআরসি তে, এটি হয়। কেভিও পর্যবেক্ষকগুলিকে সরিয়ে ফেলার পক্ষে এটি পুরোপুরি গ্রহণযোগ্য -dealloc, কারণ ক্রিস ল্যাটনার (তিনি জানেন যে তিনি কী কথা বলছেন) এখানে অ্যাপলের বিকাশকারী ফোরামগুলিতে ইঙ্গিত দেয়: devforums.apple.com/message/475850
ব্র্যাড লারসন

4
ব্র্যাড ধন্যবাদ, এই সমস্ত কাজ করার জন্য। চূড়ান্ত করার দরকার নেই, হ্যাঁ ডেললোক কিন্তু [সুপার ডেলোক] ছাড়াই। সহজ সত্যিই, একবার আপনি এটি জানতে পারবেন। আরে, @ ড্রঙ্কনবাস, এই লোকটির উত্তরটি গ্রহণ করুন!
এলিস ভ্যান লুইজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.