এনএসআউটোরলিজপুল অটোরিলিজ পুল কীভাবে কাজ করে?


95

আমি এটি বুঝতে পেরেছি, বরাদ্দ , নতুন , বা অনুলিপি দ্বারা তৈরি যে কোনও কিছুই ম্যানুয়ালি প্রকাশ করা দরকার। উদাহরণ স্বরূপ:

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

আমার প্রশ্ন, যদিও এটি কি ঠিক বৈধ হবে না ?:

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}

উত্তর:


68

হ্যাঁ, আপনার দ্বিতীয় কোড স্নিপিট পুরোপুরি বৈধ।

প্রতিবার-অটোরিলেজ কোনও বস্তুর কাছে প্রেরণ করা হয়, এটি অভ্যন্তরীণ-সর্বাধিক স্বতঃপরিচয় পুলটিতে যুক্ত হয়। পুলটি নিষ্কাশিত হয়ে গেলে, এটি পুলের সমস্ত বস্তুগুলিতে সরাসরি-দয়া করে প্রেরণ করে।

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


5
বর্তমান রান লুপ চক্রের শেষ কোথায়, যদি আমার কাছে লুপ না থাকে?
ধন্যবাদ

24
"বাইরের-সর্বাধিক" "অভ্যন্তরীণ-সর্বাধিক" হওয়া উচিত নয়?
মাইক ওয়েলার

an objectহওয়া উচিত an object that is a subclass of NSObject or NSProxy and doesn't override -autorelease

4
সম্পাদনা: বহিরাগত থেকে সর্বাধিক অভ্যন্তরীণ থেকে পরিবর্তন করা হয়েছে।
11:30

4
গুরুত্বপূর্ণ: আপনি যদি স্বয়ংক্রিয় রেফারেন্স গণনা (এআরসি) ব্যবহার করেন তবে আপনি সরাসরি অটোরিলেস পুল ব্যবহার করতে পারবেন না। পরিবর্তে, আপনি @ অটোরেলেজপুল ব্লক ব্যবহার করেন। বিকাশকারী.অ্যাপল.
মোঃ মাহবুবুর রহমান

37

এনএসআউটোরলিজপুল: ড্রেন বনাম রিলিজ

যেহেতু এর কার্যকারিতা drainএবং releaseমনে হচ্ছে বিভ্রান্তির সৃষ্টি করে, তাই এটি এখানে স্পষ্ট করার মতো হতে পারে (যদিও এটি ডকুমেন্টেশনে আচ্ছাদিত ...)।

কঠোরভাবে বলতে, বড় ছবি দৃষ্টিকোণ থেকে drainহয় না সমতূল্য release:

একটি রেফারেন্স-গণনা করা পরিবেশে, drainএকই ক্রিয়াকলাপগুলি সম্পাদন করে release, সুতরাং দু'টি সেই অর্থে সমান জোর দেওয়ার জন্য, এর অর্থ আপনি যদি পুলের চেয়ে বেশি ব্যবহার করেন তবে পুকুরটি ফাঁস করবেন নাdrainrelease

আবর্জনা-সংগৃহীত পরিবেশে, releaseকোনও বিকল্প নেই। সুতরাং এটির কোনও প্রভাব নেই। drainঅন্যদিকে, সংগ্রাহকের কাছে একটি ইঙ্গিত রয়েছে যা এটি "প্রয়োজনে সংগ্রহ করা উচিত"। এইভাবে আবর্জনা-সংগৃহীত পরিবেশে, drainসিস্টেমের ভারসাম্য সংগ্রহকে ঝাঁকুনিতে সহায়তা করে।


4
এটি 'ফুটো' হওয়া মৌলিকভাবে অসম্ভব NSAutoreleasePool। এর কারণ পুলগুলি স্ট্যাকের মতো কাজ করে। একটি পুল ইনস্ট্যান্ট করে সেই পুলটিকে সেই থ্রেডের শীর্ষে অটোরিলিজ পুল স্ট্যাকের দিকে ঠেলে দেয়। -releaseসেই পুলটিকে স্ট্যাক থেকে পপ করে দেয় এবং যে কোনও পুলের উপরে চাপ দেওয়া হয়েছিল, তবে যে কোনও কারণেই পপ করা হয়নি।
জন

7
আমি যেটা লিখেছি তার সাথে এটি কীভাবে প্রাসঙ্গিক?
মিমল্যাক

4
তিনি পছন্দ করেছেন কীভাবে তিনি সাহসের সাথে সময় কাটিয়েছিলেন এবং। এসএনএপি!
বিলি গ্রে

17

ইতিমধ্যে নির্দেশিত হিসাবে, আপনার দ্বিতীয় কোড স্নিপেট সঠিক।

আমি অটোরেলেজ পুল ব্যবহারের আরও সুসংগত উপায়টি বলতে চাই যা সমস্ত পরিবেশে কাজ করে (রেফারিং গণনা, জিসি, এআরসি) এবং ড্রেন / রিলিজ বিভ্রান্তি এড়িয়ে যায়:

int main(void) {
  @autoreleasepool {
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
  }
}

উপরের উদাহরণে দয়া করে @autoreleasepool ব্লকটি নোট করুন । এটি এখানে নথিভুক্ত করা হয়


4
দয়া করে মনে রাখবেন, এআরসি-র সাথে অটোরিলেজের অনুমতি নেই।
dmirkitanov

4
স্পষ্ট করতে, আপনাকে @autoreleasepoolএআরসি দিয়ে ব্লকটি ব্যবহার করতে হবে ।
সাইমন

7

না তুমি ভুল করছ. ডকুমেন্টেশনে স্পষ্টভাবে বলা হয়েছে যে নন-জিসির অধীনে -ড্রেইন-রিলেজের সমতুল্য, যার অর্থ এনএসআউটোরলেজপুল ফাঁস হবে না


আমি ভাবলাম কেন যদি কেসকোড-ড্রেনের সাথে কোড তৈরি করে তবে তা যদি হয়। আমি -ড্রেইন ব্যবহার করেছি কারণ আমি ভেবেছিলাম এটি এক্সকোড দ্বারা উত্পন্ন কোডের উপর ভিত্তি করে রিলেজের সমতুল্য।
জেমস সামনার্স

4
এটি 'ফাঁস' করা মৌলিকভাবে অসম্ভব NSAutoreleasePool: বিকাশকারী
অ্যাপ্লিকেশন

0

অ্যাপলের কাছ থেকে আমি যা পড়েছি: "অটোরিলেজ পুল ব্লকের শেষে, ব্লকের মধ্যে অটোরিলেজ বার্তা প্রাপ্ত বস্তুগুলিকে একটি রিলিজ বার্তা প্রেরণ করা হয় — অবজেক্টটি প্রতিবারের জন্য একটি রিলিজ বার্তা পায় যখন এটি ব্লকের মধ্যে একটি অটোরিলেজ বার্তা প্রেরণ করা হয়। "

https://developer.apple.com/library/mac/docamentation/cocoa/conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html


0

কোনও বস্তুর কাছে রিলিজের পরিবর্তে অটোরলেজ প্রেরণ কমপক্ষে পুলটি স্রোত না হওয়া পর্যন্ত object অবজেক্টের আয়ুকাল বাড়িয়ে তোলে (অবজেক্টটি যদি ধরে রাখা হয় তবে এটি আরও দীর্ঘ হতে পারে)। কোনও অবজেক্টকে একই পুলে বেশ কয়েকবার রাখা যেতে পারে, এক্ষেত্রে এটি প্রতিবার পুলে রাখার জন্য একটি রিলিজ বার্তা গ্রহণ করে।


-2

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

ড্রেন

আবর্জনা সংগৃহীত পরিবেশে, গত সংগ্রহের পরে বরাদ্দকৃত স্মৃতি বর্তমান প্রান্তিকের চেয়ে বেশি হলে আবর্জনা সংগ্রহের সূত্রপাত করে; অন্যথায় মুক্তি হিসাবে আচরণ করে। ... আবর্জনা-সংগৃহীত পরিবেশে, এই পদ্ধতিটি শেষ পর্যন্ত কল করে objc_collect_if_needed

অন্যথায়, এটি -releaseজি-নন-এর অধীনে কীভাবে আচরণ করে তা সাদৃশ্যপূর্ণ , হ্যাঁ। অন্যরা যেমন বলেছে যে, -releaseজিসির অধীনে কোনও বিকল্প নেই, তাই জিসির অধীনে পুলের সঠিকভাবে কাজ করা -drainএবং -drainনন-জিসি এর -releaseঅধীনে ঠিক কাজ করার বিষয়টি নিশ্চিত করার একমাত্র উপায় হ'ল নন-জিসির অধীনে ঠিক কাজ করে , এবং তর্কসাপেক্ষভাবে এর কার্যকারিতা আরও স্পষ্টভাবে যোগাযোগ করে বলে আমরা হব.

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

- (void)func:(NSObject*)allocd_but_not_init
{
    [allocd_but_not_init init];
}

এটি ইতিমধ্যে আপনি যেটি শুরু করেছিলেন তার চেয়ে বেশি কোনও মেমোরি গ্রাস করে না (ধরে নেওয়া হয় যে ডিআই অবজেক্টগুলি ইনস্ট্যান্ট করে না, তবে আপনি সেগুলির জন্য দায়বদ্ধ নন)।


ড্রেন সম্পর্কে আপনার তথ্য যখন ঠিক ঠিক না হয় তখন এই উত্তরটি স্বীকৃত হিসাবে রেখে আমি স্বাচ্ছন্দ্য বোধ করি না। বিকাশকারী.অ্যাপল. com/ ডকুমেন্টেশন / কোকো / রেফারেন্স / ফাউন্ডেশন/… আপডেট দেখুন এবং আমি পুনরায় স্বীকার করব।
জেমস সামনার্স

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

4
লরেন: জিসির অধীনে - [এনএসটোরলেজপুল ড্রেন] একটি সংগ্রহকে ট্রিগার করবে। -লাভ করুন, -প্রকাশ করুন, এবং -উতোরলেজ সকলেই সংগ্রাহক দ্বারা উপেক্ষা করা হয়; যে কারণে -ড্রেইন জিসির অধীনে অটোরিলিজ পুলগুলিতে ব্যবহৃত হয়।
ক্রিস হ্যানসন

'ড্রেন' এর জন্য ডকুমেন্টেশনে: একটি পরিচালিত মেমরি পরিবেশে, এটি কলিং রিলিজের মতো আচরণ করে। আপনি মুক্তির পরিবর্তে 'ড্রেন' ব্যবহার করলে মেমরি ফাঁস হবে না
এমএমএলসি

-[NSAutoreleasePool release]আবর্জনা-সংগৃহীত পরিবেশে কোনও বিকল্প নেই। -[NSAutoreleasePool drain]রেফারেন্স-গণনা এবং আবর্জনা-সংগৃহীত পরিবেশ উভয় ক্ষেত্রেই কাজ করে।
জোনাথন স্টার্লিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.