কখন আমি (- বাতিল) ভিউ-তে ইন -ডেলোকের পরিবর্তে ভিউডিজইনলোড করব?


103

কি জন্য -(void)viewDidUnloadভাল হয়?

আমি কি সব কিছু রিলেটেড করতে পারি না -dealloc? যদি ভিউটি আনলোড করা না হয় তবে কি -deallocআর বলা হবে না?

উত্তর:


51

ইতিমধ্যে যা ইঙ্গিত করা হয়েছে তা ছাড়াও, আমি পিছনে যুক্তি সম্পর্কে আরও বিস্তৃত করতে চেয়েছিলাম -viewDidUnload

এটি বাস্তবায়নের অন্যতম গুরুত্বপূর্ণ কারণ হ'ল UIViewControllerউপশ্রেণীতে সাধারণত ভিউ হায়ারার্কির বিভিন্ন সাবভিউতে মালিকানার রেফারেন্স থাকে। উদাহরণস্বরূপ, IBOutletsকোনও নিব থেকে লোড করার সময়, বা প্রোগ্রামের ভিতরে ভিতরে এই বৈশিষ্ট্যগুলি সেট করা যেতে পারে -loadView

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

আপনি এখানে প্রকাশিত অবজেক্টগুলি সাধারণত পুনরায় তৈরি করা হয় এবং UIViewControllerদৃশ্যটি যখন re-loadedকোনও নিব থেকে হয় বা প্রয়োগের মাধ্যমে হয় তখন তা আবার সেট করা হয় -loadView

এছাড়াও মনে রাখবেন যে UIViewController viewসম্পত্তিটি nilযখন এই পদ্ধতিটি বলা হয় ততক্ষণে।


1
নিয়ামক জীবনচক্রের ভিউ / ভিউ বুঝতে আপনার বিকাশকারী.অ্যাপল.
com

21

ডকুমেন্টেশন যেমন বলে :

লো-মেমোরি অবস্থার সময় এটিকে বলা হয় যখন মেমরি মুক্ত করার জন্য ভিউ কন্ট্রোলারের নিজের দৃষ্টিভঙ্গি এবং সেই দৃশ্যের সাথে সম্পর্কিত কোনও অবজেক্ট প্রকাশ করতে হয়।

একই পরিস্থিতিতে ডাকা deallocহয় না । এই পদ্ধতিটি কেবল ওএস 3 এবং এর উপরে রয়েছে। আইফোন ওএস ২.x একই পরিস্থিতি মোকাবেলা করা ছিল আসল ব্যথা!

জুলাই ২০১৫ আপডেট করুন : এটি লক্ষ করা উচিত যে viewDidUnloadআইওএস in এ অবমূল্যায়ন করা হয়েছিল কারণ "ভিউগুলি আর কম-স্মৃতিশক্তির অবস্থার অধীনে শুদ্ধ হয় না এবং তাই এই পদ্ধতিটি কখনই ডাকা হয় না।" সুতরাং, আধুনিক পরামর্শটি এটি সম্পর্কে চিন্তা করা এবং ব্যবহার করার নয় dealloc


6
এছাড়াও ডকগুলি থেকে: "আপনার ভিডডিলড পদ্ধতিতে বা আপনার অ্যাপ্লিকেশনটির অন্যান্য অংশ থেকে আপনি সহজেই পুনরায় তৈরি করতে পারেন এমন অবজেক্টের জন্য আপনার এটি করা উচিত user ব্যবহারকারীর ডেটা বা এমন কোনও তথ্য প্রকাশ করতে আপনার এই পদ্ধতিটি ব্যবহার করা উচিত নয় সহজেই পুনরায় তৈরি করা হয়েছে "। এটা আমার নিজেও একটি প্রশ্ন ছিল, ধন্যবাদ!
লিওলোবাটো

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

না, আপনি যদি অন্য দৃষ্টিভঙ্গির জন্য কেবল একটি দর্শন পরিবর্তন করেন তবে আপনি এটি ব্যবহার করবেন না। আপনি যেখানে ইউআইএনএভিগেশন কন্ট্রোলারের সাথে মতামতের একটি "স্ট্যাক" রেখেছেন সে ক্ষেত্রে ভাবুন। কেবলমাত্র একটি দৃশ্য দৃশ্যমান এবং আপনার যদি মেমরির সতর্কতা থাকে তবে আপনি দৃশ্যমান নয় এমন সমস্তগুলি মুক্তি দিতে পারেন।
স্টিফেন ডার্লিংটন

আপনি কীভাবে নিয়ন্ত্রণ করবেন যে থ্যাঙ্কডাউনলোডকে বর্তমান দৃশ্যমান দৃশ্যে কল করা হয়নি যেমন ধন্যবাদ উল্লেখ করেছে?
এরিয়েলকামাস

1
ভিউডিডঅনলোড বর্তমানে দৃশ্যমান দৃশ্যে কল করা হবে না, কেবল এমন দৃশ্যগুলিতে যা দৃশ্যমান নয়।
প্রোগ্রামার

9

এর কারণ আপনি সাধারণত সেট হবে @propertyযেমন "(nonatomic, retain)"এবং এই ধরনের সেটার জন্য আপনাকে বর্তমান বস্তুর প্রকাশ তৈরি করা হয় যে হিসাবে এবং তারপর যুক্তি অর্থাত বজায়

self.property = nil;

... এর লাইনে কিছু করে:

[property release];
property = [nil retain];

সুতরাং আপনি একটি পাথর দিয়ে দুটি পাখি হত্যা করছেন: মেমরি পরিচালনা (বিদ্যমান বস্তুটি প্রকাশ করে) এবং পয়েন্টারটিকে শূন্য করার জন্য (যে কোনও শূন্য পয়েন্টারে কোনও বার্তা প্রেরণ শূন্য হবে)।

আশা করি এইটি কাজ করবে.


8

মনে রাখবেন viewDidUnloadএটি ভিউ কন্ট্রোলারে একটি পদ্ধতি, ভিউতে নয়। দৃশ্য এর dealloc পদ্ধতি যখন দৃশ্য unloads নামক পেতে হবে, কিন্তু দৃশ্য নিয়ামক এর dealloc পদ্ধতি পরে পর্যন্ত বলা যাবে না।

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


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

ঠিক আছে, কেবল মনে রাখবেন যে আপনার দৃষ্টিভঙ্গিটি প্রদর্শিত হচ্ছে এমন একটি ক্ষেত্রে, তবে এর উপরে আপনার চিত্র পিকারের মতো একটি পূর্ণস্ক্রিন ভিউ রয়েছে, আপনার দৃশ্যটি এটি না হওয়ার পরিকল্পনা না করলেও তা লোড হতে পারে।
ডেভিড মায়মডেস

6

উপসংহার:

দেখুন কন্ট্রোলারদের একটি দেখার সম্পত্তি আছে। সাধারণত একটি নিব বা কোডের টুকরা এই ভিউতে অন্যান্য ভিউ যুক্ত করে। এটি প্রায়শই একটি ভিডিউডডিলোড পদ্ধতির অভ্যন্তরে ঘটে থাকে:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createManyViewsAndAddThemToSelfDotView];
}

তদতিরিক্ত, একটি নিব ফাইল একটি বোতাম তৈরি করতে পারে এবং এটিকে নিয়ামকের দৃশ্যে সংযোজন করতে পারে।

আইফোন ওএস ২.২-এ, যখন -DidReসেপ মেমরি ওয়ার্নিংটি সিস্টেম থেকে নেওয়া হয়েছিল, আপনাকে মেমরি মুক্ত করার জন্য কিছু ছেড়ে দিতে হয়েছিল। এটি যদি বোধগম্য হয় তবে আপনি পুরো ভিউ নিয়ন্ত্রকের দৃষ্টিভঙ্গি প্রকাশ করতে পারেন। বা এটিতে কেবল বড় মেমরি গ্রাসকারী সামগ্রী।

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

এখন, নতুন ওএস 3.0.০-তে, একটি ভিউডিউডডাউনলোড পদ্ধতি রয়েছে, যা কম স্মৃতিশক্তির কারণে ভিউটি লোড করা হলে সিস্টেম থেকে ডাকা হবে (দয়া করে আমাকে সংশোধন করুন: কখন এটি ডাকা হয়?)

-ভিউডিডিউনলোডটি এমন সমস্ত অবজেক্টকে প্রকাশ করতে ব্যবহৃত হয় যা ভিউ কন্ট্রোলার নিজেই এবং দর্শন উভয়েরই মালিকানাধীন ছিল। কারণ: কোনও ভিউ কন্ট্রোলার যদি ভিউয়ের বাচ্চাদের রেফারেন্স ধরে রাখে, অর্থাত্ একটি বোতাম, তবে রেফারেন্স প্রাপ্ত শিশু দৃষ্টিভঙ্গি প্রকাশিত হবে না, কারণ তাদের ধরে রাখার গণনাটি = = ১ they স্মৃতি থেকে.


1
রিমবারের দৃষ্টিতে সেল্ফ.বাটন = শূন্য করতে না করা, [বোতাম রিলিজ] করা হয়নি।
এম কে 12

6

অ্যাপল আপনার ভিজেটিকে ছেড়ে দেওয়ার জন্য এখনই ড্রেডিজিপমেমরি ওয়ার্নিং বা ডেলোক ব্যবহার করবে Apple

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


5

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


3

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

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