সুইফট মধ্যে dealloc


145

আমি কোনও ভিউ কন্ট্রোলারের জীবনের শেষে কোনও NSNotificationCenterবিজ্ঞপ্তি মুছে ফেলার জন্য কিছু পরিষ্কার করতে চাই perform বাস্তবায়নকারী deallocএকটি সুইফট কম্পাইলার ভুলবশত ফলাফল:

Cannot override 'dealloc' which has been marked unavailable

সুইফটে কোনও অবজেক্টের জীবনের শেষে কিছু সাফাইয়ের পছন্দের উপায় কী?

উত্তর:


333
deinit {
    // perform the deinitialization
}

থেকে সুইফট ডকুমেন্টেশন :

ক্লাসের উদাহরণটি হ্রাস না করার আগেই একটি ডিনিটালাইজারকে ডাকা হয়। আপনি কী কীভাবে আর কী কী কী কী কী কী কী কী কী কী কী কী কী কী কীভাবে ইভা দ্বারা কীওয়ার্ডের সাথে লিখতে হয় তার অনুরূপ, ডিনিট কিওয়ার্ড দিয়ে ডিনিটায়ালাইজার লিখেন। ডিনিটায়ালাইজারগুলি কেবল শ্রেণীর ধরণের ক্ষেত্রে উপলব্ধ।

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


45
deinit {
    // perform the deinitialization
}

সুইফ্ট "ডেলোক" এর সঠিক উত্তর।

যাইহোক, আইওএস 9 এ নতুনটি উল্লেখ করা ভাল যে এনএসএনটিফিকেশন সেন্টারটিকে আর পরিষ্কার করার দরকার নেই!

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#X10_11Notes

NSNotificationCenter

ওএস এক্স 10.11 এবং আইওএস 9.0 এ এনএসএনটিফিকেশন সেন্টার এবং এনএসডিস্ট্রিবিউটেড নোটিকেশন সেন্টার আর নিবন্ধিত পর্যবেক্ষকদের যে বিজ্ঞপ্তিগুলি পাঠিয়ে দেবে তা আর প্রেরণ করবে না। যদি পর্যবেক্ষক শূণ্য-দুর্বল রেফারেন্স হিসাবে সংরক্ষণ করতে সক্ষম হয় তবে অন্তর্নিহিত স্টোরেজটি পর্যবেক্ষককে একটি শূণ্য দুর্বল রেফারেন্স হিসাবে সংরক্ষণ করবে, বিকল্প হিসাবে যদি বস্তুটি দুর্বলভাবে সংরক্ষণ করা যায় না (যেমন এটির একটি কাস্টম ধরে রাখা / রিলিজ প্রক্রিয়া রয়েছে যা রানটাইমকে আটকাবে বস্তুটিকে দুর্বলভাবে সঞ্চয় করতে সক্ষম হওয়া থেকে) এটি বস্তুটিকে একটি দুর্বল দুর্বল শূন্য রেফারেন্স হিসাবে সংরক্ষণ করবে। এর অর্থ হল যে পর্যবেক্ষকদের তাদের নির্বাসন পদ্ধতিতে নিবন্ধভুক্ত করার প্রয়োজন নেই। পরবর্তী পর্যালোচনা যা সেই পর্যবেক্ষকের কাছে পাঠানো হবে তা শূন্য রেফারেন্স সনাক্ত করবে এবং স্বয়ংক্রিয়ভাবে পর্যবেক্ষককে নিবন্ধভুক্ত করবে। যদি কোনও অবজেক্টকে দুর্বলভাবে রেফারেন্স করা যায় তবে বিজ্ঞপ্তিগুলি ছাড়ার সময় পর্যবেক্ষকের কাছে আর প্রেরণ করা হবে না; ডেললকের সময় বিজ্ঞপ্তি প্রাপ্তির পূর্বের আচরণটি এখনও দুর্বলভাবে শূণ্যকরণের রেফারেন্স পর্যবেক্ষকদের ক্ষেত্রে উপস্থিত রয়েছে। ভিত্তিক পর্যবেক্ষকগুলিকে - [NSNotificationsCenter addObserverForName: অবজেক্ট: সারি: ইউজিং ব্লক] এর মাধ্যমে অবরুদ্ধ পর্যবেক্ষকদের অবরুদ্ধ করতে হবে যখন সিস্টেম এখনও এই পর্যবেক্ষকদের একটি দৃ reference় রেফারেন্স রাখে না তখন ব্যবহারটি আর ব্যবহার করা হবে না। অকাল পর্যবেক্ষক (হয় দুর্বলভাবে রেফারেন্সযুক্ত বা শূণ্য রেফারেন্সযুক্ত) অপসারণ এখনও সমর্থিত। সিএফএনটিফিকেশন সেন্টারএডডোবার্সার এই আচরণের সাথে সম্মতি দেয় না কারণ পর্যবেক্ষক কোনও বস্তু হতে পারে না। ভিত্তিক পর্যবেক্ষকগুলিকে - [NSNotificationsCenter addObserverForName: অবজেক্ট: সারি: ইউজিং ব্লক] এর মাধ্যমে অবরুদ্ধ পর্যবেক্ষকদের অবরুদ্ধ করতে হবে যখন সিস্টেম এখনও এই পর্যবেক্ষকদের একটি দৃ reference় রেফারেন্স রাখে না তখন ব্যবহারটি আর ব্যবহার করা হবে না। অকাল পর্যবেক্ষক (হয় দুর্বলভাবে রেফারেন্সযুক্ত বা শূণ্য রেফারেন্সযুক্ত) অপসারণ এখনও সমর্থিত। সিএফএনটিফিকেশন সেন্টারএডডোবার্সার এই আচরণের সাথে সম্মতি দেয় না কারণ পর্যবেক্ষক কোনও বস্তু হতে পারে না। ভিত্তিক পর্যবেক্ষকদের - [NSNotificationsCenter addObserverForName: অবজেক্ট: সারি: ইউজব্লক] এর মাধ্যমে অবরুদ্ধ পর্যবেক্ষকদের অবরুদ্ধ করতে হবে যখন সিস্টেম এখনও এই পর্যবেক্ষকদের একটি দৃ reference় রেফারেন্স রাখে না তখন ব্যবহারটি আর ব্যবহারযোগ্য না হওয়া দরকার। অকাল পর্যবেক্ষক (হয় দুর্বলভাবে রেফারেন্সযুক্ত বা শূণ্য রেফারেন্সযুক্ত) অপসারণ এখনও সমর্থিত। সিএফএনটিফিকেশন সেন্টারএডডোবার্সার এই আচরণের সাথে সম্মতি দেয় না কারণ পর্যবেক্ষক কোনও বস্তু হতে পারে না।

তবে শক্তিশালী রেফারেন্সগুলি সম্পর্কে নীচের পয়েন্টগুলি নোট করুন, তাই আপনাকে যাইহোক ক্লিনআপ সম্পর্কে চিন্তা করতে হতে পারে ...?


3
বিজ্ঞপ্তি ব্লকের কোনও শক্ত রেফারেন্স না থাকলে আপনার অবশ্যই পর্যবেক্ষককে অপসারণ করতে হবে।
টাইগারকডিং

পর্যবেক্ষকদের পরিষ্কার না করার জন্য +1 জানা গুরুত্বপূর্ণ! আমি সমস্ত ক্যাপচারিং রেফারেন্সকে দুর্বল করি তাই এর সাথে কখনই ডিল করতে হবে না।
n13

2
নোটিফিকেশন ব্লক সবসময় ডকুমেন্টেশন অনুযায়ী দৃ strongly়ভাবে উল্লেখ করা হয় বলে মনে হয়। সুতরাং: আপনি যদি আপনার বিজ্ঞপ্তিগুলি হ্যান্ডেল করতে ব্লক ব্যবহার করে থাকেন তবে আপনাকে তাদের জন্য ডিনিটের জন্য নিবন্ধন করতে হবে
মার্শবার

22

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

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

ক্লাস সংজ্ঞা প্রতি ক্লাসে সর্বাধিক একজন ডিনিটায়ালাইজার থাকতে পারে। ডিনিটায়ালাইজার কোনও প্যারামিটার নেয় না এবং প্রথম বন্ধনী ছাড়াই লিখিত হয়:

deinit {
    // perform the deinitialization
}

2

বিলোপকরণের পূর্বে পর্যবেক্ষক অপসারণ করা প্রয়োজন অন্যথায় ক্রাশ হবে। এটি ব্যবহার করে করা যেতে পারে

deinit {
    // perform the deinitialization
    print("deinit")

    removeObserver(self, forKeyPath: kSelectedViewControllerKey, context: nil)
    removeObserver(self, forKeyPath: kSelectedIndexKey, context: nil)

}

-2

অন্য ক্লাসে ডিনিট থেকে কোনও পদ্ধতি কল করার সময় সাবধানতা অবলম্বন করুন এটি সম্ভবত ক্রাশে শেষ হবে


1
হ্রাস যেহেতু অগত্যা ক্ষেত্রে করা উচিত নয়। রেফারেন্স থেকে ডক্স : যেহেতু কোনও উদাহরণ ডিনিটায়ালাইজার বলা না হওয়া অবধি অপসারণযোগ্য নয়, ডিনিটালাইজার তার দ্বারা ডাকা সমস্ত উদাহরণগুলিতে অ্যাক্সেস করতে পারে এবং সেই বৈশিষ্ট্যের উপর ভিত্তি করে তার আচরণটি পরিবর্তন করতে পারে (যেমন কোনও ফাইলের নাম সন্ধান করা দরকার যা বন্ধ করা)।
সুপারজোজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.