এআরসি ব্যবহার করার সময় আমি কী প্রোপার্টিগুলি ডিলোকের জন্য নির্ধারণ করি?


125

আমি আইওএস 5 এ স্বয়ংক্রিয় রেফারেন্স গণনা শেখার চেষ্টা করছি Now এখন এই প্রশ্নের প্রথম অংশটি সহজ হওয়া উচিত:

  1. এটিকে সঠিক যে, আমি করি না যখন এআরসি ব্যবহার করে আমার dealloc স্পষ্ট মুক্তি-সম্পত্তি বিবৃতি লিখতে প্রয়োজন? অন্য কথায়, এটা যে নিম্নলিখিত নেই সত্য নয় একটি স্পষ্ট dealloc প্রয়োজন?

    @interface MyClass : NSObject
    @property (strong, nonatomic) NSObject* myProperty;
    @end
    
    @implementation MyClass
    @synthesize myProperty;
    @end
  2. আমার পরবর্তী এবং আরও গুরুত্বপূর্ণ প্রশ্নটি রূপান্তরকরণ থেকে এআরসি রিলিজ নোটের নথিতে একটি লাইন থেকে আসে :

    আপনার ইনস্ট্যান্স ভেরিয়েবলগুলি (প্রকৃতপক্ষে প্রকাশ করতে হবে) করতে হবে না, তবে আপনাকে সিস্টেমের ক্লাস এবং এআরসি ব্যবহার করে সংকলিত নয় এমন অন্যান্য কোডে [স্ব-সেটডেলিগেট: নীল] আবেদন করতে হবে।

    এটি প্রশ্নটি জাগায়: আমি কীভাবে জানি যে কোন সিস্টেম ক্লাসগুলি এআরসি দিয়ে সংকলিত হয় না? আমি কখন আমার নিজের ডেলোক তৈরি করব এবং স্পষ্টভাবে দৃ properties়ভাবে ধরে রাখার বৈশিষ্ট্যগুলিকে শূন্য করতে চাই? আমি কি সম্পত্তিগুলিতে ব্যবহৃত সমস্ত এনএস এবং ইউআই ফ্রেমওয়ার্ক ক্লাসগুলিকে সুস্পষ্ট ডিলোকের প্রয়োজন মনে করি?

ম্যানুয়াল রেফারেন্স ট্র্যাকিং ব্যবহার করার সময় কোনও সম্পত্তির ব্যাকিং আইভার প্রকাশের অনুশীলনের উপর এসও এবং অন্য কোথাও প্রচুর তথ্য রয়েছে তবে এআরসি ব্যবহার করার সময় এটি সম্পর্কে অপেক্ষাকৃত কম little

উত্তর:


197

সংক্ষিপ্ত উত্তর : না, আপনাকে deallocএআরসি এর আওতায় থাকা সম্পত্তিগুলি বাতিল করতে হবে না ।

দীর্ঘ উত্তর : deallocএমনকি ম্যানুয়াল মেমরি পরিচালনার ক্ষেত্রেও আপনার কখনও সম্পত্তি হ্রাস করা উচিত নয় ।

এমআরআর-তে আপনার আইভারগুলি ছেড়ে দেওয়া উচিত । বৈশিষ্ট্যগুলি নিল করার অর্থ সেটারগুলিকে কল করা, যা কোডটি কল করতে পারে যে এটি যাতে স্পর্শ না করেdealloc (যেমন যদি আপনার শ্রেণি, বা একটি সাবক্লাস, সেটারটিকে ওভাররাইড করে)। একইভাবে এটি কেভিও বিজ্ঞপ্তিগুলি ট্রিগার করতে পারে। আইভার ছেড়ে দেওয়ার পরিবর্তে এই অনাকাঙ্ক্ষিত আচরণগুলি এড়িয়ে চলে।

এআরসি-তে, সিস্টেম স্বয়ংক্রিয়ভাবে আপনার জন্য কোনও আইভর প্রকাশ করে, সুতরাং যদি আপনি এটি করছেন তবে আপনাকে বাস্তবায়ন করতে হবে না dealloc। তবে আপনার যদি কোনও অ-অবজেক্ট আইভার থাকে তবে বিশেষ হ্যান্ডলিংয়ের প্রয়োজন (যেমন বরাদ্দ করা বাফারগুলি যা আপনার প্রয়োজনfree() ) আপনার এখনও তাদের সাথে ডিল করতে হবেdealloc

তদুপরি, যদি আপনি নিজেকে যেকোন বস্তুর প্রতিনিধি হিসাবে সেট করেন তবে আপনার সেই সম্পর্কটি আন-সেট করা উচিত dealloc(এটি কল করার বিষয়ে কিছুটা নয় [obj setDelegate:nil])। ক্লাসে এটি করার বিষয়ে যে নোটটি এআরসি দিয়ে সংকলিত হয়নি তা দুর্বল বৈশিষ্ট্যগুলির পক্ষে সম্মতি। যদি শ্রেণিটি স্পষ্টভাবে তার delegateসম্পত্তিটিকে চিহ্নিত করে weakতবে আপনাকে এটি করতে হবে না কারণ দুর্বল বৈশিষ্ট্যের প্রকৃতির অর্থ এটি আপনার জন্য নিখুঁত হবে। তবে যদি সম্পত্তি চিহ্নিত করা থাকে assignতবে আপনার নিজের এটি বন্ধ করে দেওয়া উচিত dealloc, অন্যথায় শ্রেণিটি ঝুঁকির পয়েন্টার সহ ছেড়ে যায় এবং যদি এটি তার প্রতিনিধিকে বার্তা দেওয়ার চেষ্টা করে তবে ক্র্যাশ হতে পারে। নোট করুন যে এটি কেবল অ-রক্ষিত সম্পর্কের ক্ষেত্রে প্রযোজ্য যেমন প্রতিনিধিরা।


2
এইবার বুঝতে পারছি! যাইহোক আমি আপনাকে এটি জিজ্ঞাসা করি: আমার কাছে একটি সাধারণ MyController : UIViewControllerদৃশ্যটি আমার কাছে এমন একটি বর্গ রয়েছে যা একটি ইউআইভিউ তৈরি করে এবং তার মালিকানাধীন করে তোলে এবং দর্শকের প্রতিনিধি নিজেই সেট করে। এটি সেই দৃশ্যের একমাত্র রক্ষণাবেক্ষণের মালিক। যখন নিয়ামকটি dealloc'ed হয়ে যায়, তখন ভিউটিও dealloc'ed হওয়া উচিত। ডেলিগেট পয়েন্টারটি ঝুঁকছে কিনা তা কি তবে গুরুত্বপূর্ণ?
এফুরি

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

3
@ জাইটিসেন: না unsafe_unretainedan একটি assignসম্পত্তির সমান এবং এটি এমআরআর এর অধীনে প্রতিনিধিদের সম্পর্কের জন্য স্বাভাবিক আচরণ এবং এগুলি শোধ করার প্রয়োজন।
লিলি বালার্ড

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

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

2

কেবল বিপরীত উত্তর দিতে ...

সংক্ষিপ্ত উত্তর : না, আপনাকে deallocএআরসি এর আওতায় স্বয়ংক্রিয় সংশ্লেষিত বৈশিষ্ট্যগুলি মুছে ফেলতে হবে না । এবং আপনাকে সেইটারগুলির জন্য সেটার ব্যবহার করতে হবে না init

দীর্ঘ উত্তর : আপনি উচিত মধ্যে কাস্টম সংশ্লেষিত বৈশিষ্ট্য আউট Nil dealloc, এমনকি এআরসি অধীনে। এবং আপনার মধ্যে যারা আছে তাদের জন্য সেটটার ব্যবহার করা উচিত init

বিষয়টি হ'ল আপনার কাস্টম-সংশ্লেষিত বৈশিষ্ট্যগুলি বাতিল হওয়া সম্পর্কিত নিরাপদ এবং প্রতিসম হওয়া উচিত m

একটি টাইমার জন্য একটি সম্ভাব্য সেটটার:

-(void)setTimer:(NSTimer *)timer
{
    if (timer == _timer)
        return;

    [timer retain];
    [_timer invalidate];
    [_timer release];
    _timer = timer;
    [_timer fire];
}

একটি স্ক্রোলভিউ, টেবিলভিউ, ওয়েবভিউ, পাঠ্যক্ষেত্র, ...

-(void)setScrollView:(UIScrollView *)scrollView
{
    if (scrollView == _scrollView)
        return;

    [scrollView retain];
    [_scrollView setDelegate:nil];
    [_scrollView release];
    _scrollView = scrollView;
    [_scrollView setDelegate:self];
}

কেভিওর সম্পত্তির জন্য একটি সম্ভাব্য সেটার:

-(void)setButton:(UIButton *)button
{
    if (button == _button)
        return;

    [button retain];
    [_button removeObserver:self forKeyPath:@"tintColor"];
    [_button release];
    _button = button;
    [_button addObserver:self forKeyPath:@"tintColor" options:(NSKeyValueObservingOptions)0 context:NULL];
}

তারপর আপনার জন্য কোন কোড নকল করতে হবে না dealloc, didReceiveMemoryWarning, viewDidUnload, ... আর আপনার সম্পত্তি নিরাপদে পাবলিক করা যেতে পারে। আপনি যদি সম্পত্তিগুলি শূন্য করার বিষয়ে উদ্বিগ্ন হয়ে থাকেন deallocতবে আপনার সেটারগুলি আবার পরীক্ষা করার সময় হতে পারে।

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