একটি সুইফ্ট প্রোগ্রামে অটোরেলিজপুল ব্যবহার করা কি প্রয়োজনীয়?


97

এই ডাব্লুডাব্লুডিসি 14 উপস্থাপনার পৃষ্ঠা 17 এ , এটি বলে

উদ্দেশ্য-সি নিয়ে কাজ করছেন? তবুও অটোরিলিজ পুলগুলি
অটোরেলিজপুল to / * কোড * / manage পরিচালনা করতে হবে

ওটার মানে কি? এর অর্থ কি এই যে আমার কোড বেসে কোনও উদ্দেশ্য-সি ফাইল না থাকলে autoreleasepool {}অপ্রয়োজনীয়?

ইন একটি সম্পর্কিত প্রশ্নের উত্তর , সেখানে একটি উদাহরণ কোথায় autoreleasepoolউপযোগী হতে পারে:

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000; ++j) {
        @autoreleasepool {
            for (int i = 0; i < 10000; ++i) {
                NSNumber *number = [NSNumber numberWithInt:(i+j)];
                NSLog(@"number = %p", number);
            }
        }
    }
}

উপরের কোডটি যদি সুইফটে autoreleasepoolবাদ পড়ার সাথে অনুবাদ করা হয় , তবে সুইফটটি কি যথেষ্ট স্মার্ট হবে যে numberভেরিয়েবলটি প্রথমটির পরে প্রকাশ করা উচিত }(অন্য কয়েকটি ভাষার মতো)?


4

উত্তর:


199

autoreleasepoolপ্যাটার্ন যখন ফিরে সুইফট ব্যবহার করা হয় autoreleaseবস্তু (আপনার উদ্দেশ্য সি কোড বা কোকো শ্রেণীর ব্যবহার হয় দ্বারা নির্মিত)। autoreleaseঅনেক এটা পছন্দ সুইফট ফাংশন মধ্যে প্যাটার্ন উদ্দেশ্য সি কাজ করেন। উদাহরণস্বরূপ, আপনার পদ্ধতির এই দ্রুত পরিবর্তনটি বিবেচনা করুন (তাত্পর্যপূর্ণ NSImage/ UIImageঅবজেক্টস):

func useManyImages() {
    let filename = pathForResourceInBundle

    for _ in 0 ..< 5 {
        autoreleasepool {
            for _ in 0 ..< 1000 {
                let image = NSImage(contentsOfFile: filename)
            }
        }
    }
}

আপনি যদি এটি ইনস্ট্রুমেন্টগুলিতে চালনা করেন তবে আপনি নীচের মত একটি বরাদ্দ গ্রাফ দেখতে পাবেন:

অটোরেলিজপুল সহ

তবে আপনি যদি অটোরিলিজ পুল ছাড়াই এটি করেন তবে আপনি দেখতে পাবেন যে শীর্ষের মেমরির ব্যবহার বেশি:

অটোরেলিজপুল ছাড়াই

autoreleasepoolআপনি স্পষ্টভাবে পরিচালনা করতে যখন autorelease বস্তু সুইফট মধ্যে deallocated হয় অনুমতি দেয়, ঠিক মত আপনি উদ্দেশ্য সি মধ্যে করতে সক্ষম হয়েছি।

দ্রষ্টব্য: সুইফট নেটিভ অবজেক্টগুলির সাথে ডিল করার সময় আপনি সাধারণত অটোরিলেজ অবজেক্টগুলি গ্রহণ করবেন না। এজন্য উপস্থাপনাটি কেবল "উদ্দেশ্য-সি'র সাথে কাজ করা" যখন এই প্রয়োজনটির বিষয়ে কেবলতার বিষয়ে উল্লেখ করেছিল, যদিও আমি আশা করি অ্যাপল এই বিষয়টিতে আরও স্পষ্ট ছিল। তবে আপনি যদি অবজেক্টিভ-সি অবজেক্ট (কোকো ক্লাস সহ) নিয়ে কাজ করছেন তবে সেগুলি অটোরিলেজ অবজেক্ট হতে পারে, সেক্ষেত্রে অবজেক্টিভ-সি @autoreleasepoolপ্যাটার্নের এই সুইফট রেন্ডিশনটি এখনও কার্যকর।


4
এই সব প্রশ্নের, আপনি আপনার নিজস্ব বর্গ লিখতে পারেন, এবং এটি একটি কি আছে printlnএর মধ্যে deinit, এবং এটি অবিকল যাচাই করার জন্য যখন বস্তু deallocated হয় বেশ সহজ হয়ে যায়। বা ইনস্ট্রুমেন্টস এ এটি পর্যবেক্ষণ। আপনার প্রশ্নের উত্তরে, এটি প্রদর্শিত হবে যে সুইফট অবজেক্টগুলি +1 ধরে রাখার গণনা (অটোরিলেজ অবজেক্টস নয়) দিয়ে ফাংশন থেকে ফিরে আসে এবং কলার সেই বিন্দু থেকে নির্বিঘ্নে মালিকানা পরিচালনা করবে (উদাহরণস্বরূপ, এবং যদি ফেরত বস্তুটি সুযোগের বাইরে চলে যায়, এটি অবিলম্বে deallocated হয়, একটি অটোরেলিজপুল স্থাপন করা হয় না)।
রব

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

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

4
আমি একটি উদাহরণ খুঁজে পেয়েছি যে কাজ করে! শুধু এনএসবান্ডেলের pathForResource:ofType:বারবার কল করুন ।
ম্যাট

4
আমার pathForResource:ofType:উদাহরণটি আর এক্সকোড 6.3 / সুইফট 1.2 তে কাজ করে না। :)
ম্যাট

5

আপনি যদি এটিটিকে সমতুল্য অবজেক্টিভ-সি কোড ব্যবহার করেন তবে আপনি এটি সুইফটে ব্যবহার করবেন।

সংখ্যা পরিবর্তনশীলটি প্রথম প্রকাশের পরে প্রকাশ করা উচিত তা জানতে সুইফট কি যথেষ্ট স্মার্ট হবে?

কেবলমাত্র যদি উদ্দেশ্য-সি করে। উভয়ই কোকো মেমরি পরিচালনার নিয়মগুলি পরিচালনা করে।

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


4
যদি সুইফট এর জন্য ওজেক্টিভ-সি এর মতো একই আচরণ করে তবে উপস্থাপনাটি কেন "উদ্দেশ্য-সি নিয়ে কাজ করা" উল্লেখ করেছে? বিশেষভাবে?
ইথান

9
@ ইথান এটি প্রদর্শিত হবে যে নেটিভ সুইফ্ট অবজেক্টস স্বতঃপ্রণোদিত বস্তু নয় এবং এটি autoreleasepoolনির্মাণ সম্পূর্ণ অপ্রয়োজনীয়। তবে যদি আপনার সুইফ্ট কোডটি অবজেক্টিভ-সি অবজেক্টগুলি (কোকো অবজেক্ট সহ) পরিচালনা করে থাকে তবে সেগুলি অটোরিলেজ নিদর্শনগুলি অনুসরণ করে এবং সুতরাং এই নির্মাণটি autoreleasepoolদরকারী হয়ে ওঠে।
রব

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