"__ block" কীওয়ার্ডটির অর্থ কী?


446

কি ঠিক আছে __blockউদ্দেশ্য সি গড় মধ্যে শব্দ? আমি জানি এটি আপনাকে ব্লকের মধ্যে ভেরিয়েবলগুলি পরিবর্তন করতে দেয় তবে আমি জানতে চাই ...

  1. সংকলকটি ঠিক কী বলে?
  2. এটি অন্য কিছু করে?
  3. যদি এটি সব হয় তবে এটি কেন প্রথম স্থানে দরকার?
  4. এটা কোথাও ডক্সে আছে? (আমি এটি খুঁজে পাচ্ছি না)

3
পরীক্ষা এখানে , এবং "ব্লক এবং ভেরিয়েবল" বিভাগে।


1
@ কোড বাঁদর: আমি বিশেষভাবে কীওয়ার্ডটি সম্পর্কে জিজ্ঞাসা করছিলাম, সাধারণভাবে বাক্য গঠন সম্পর্কে নয়। সুতরাং এটি সত্যিই একটি সদৃশ মনে করবেন না।
মিজিসরভি

3
@ কোড বাঁদর: না, এটি কোনও সদৃশ নয়। আপনি যে প্রশ্নটি উল্লেখ করেছেন তা মোটেই কথা বলে না __block
ডার্কডাস্ট

3
এবং যদি কেউ ভাবছেন যে কীভাবে অবজেক্টিভ-সি এর সুইফটে__block অনুবাদ করা উচিত: "ক্লোজারগুলিতে [সুইফটে] ব্লকের মতো [একইভাবে ক্যাপচার শব্দার্থবিজ্ঞান রয়েছে] তবে এটি একটি মূল উপায়ে পৃথক: পরিবর্তনশীল অনুলিপি না করে পরিবর্তিত হয়। অন্য কথায়, অবজেক্টিভ-সিতে __ block এর আচরণটি সুইফটে পরিবর্তনশীলগুলির জন্য ডিফল্ট আচরণ ”" অ্যাপলের বই থেকে: সুইফট উইথ কোকো এবং অবজেক্টিভ-সি (সুইফট ২.২) ব্যবহার করা।
জারি কেনেনেন

উত্তর:


543

এটি সংকলকটিকে বলে যে এটির দ্বারা চিহ্নিত যে কোনও চলকটি যখন কোনও ব্লকের অভ্যন্তরে ব্যবহৃত হয় তখন একটি বিশেষ উপায়ে চিকিত্সা করা উচিত। সাধারণত, ভেরিয়েবল এবং তাদের বিষয়বস্তুগুলি যা ব্লকগুলিতে ব্যবহৃত হয় সেগুলি অনুলিপি করা হয়, সুতরাং এই ভেরিয়েবলগুলিতে করা কোনও পরিবর্তন ব্লকের বাইরে দেখায় না। এগুলি চিহ্নিত করা হলে __block, ব্লকের ভিতরে করা পরিবর্তনগুলি এর বাইরেও দৃশ্যমান হয়।

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

গুরুত্বপূর্ণ উদাহরণটি এটির একটি:

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;

{
    NSInteger localCounter = 42;
    __block char localCharacter;

    void (^aBlock)(void) = ^(void) {
        ++CounterGlobal;
        ++CounterStatic;
        CounterGlobal = localCounter; // localCounter fixed at block creation
        localCharacter = 'a'; // sets localCharacter in enclosing scope
    };

    ++localCounter; // unseen by the block
    localCharacter = 'b';

    aBlock(); // execute the block
    // localCharacter now 'a'
}

এই উদাহরণে, ব্লকটি বলার আগে localCounterএবং উভয়ই localCharacterসংশোধিত হয়। তবে, ব্লকের ভিতরে, কেবলমাত্র পরিবর্তনটি localCharacterদৃশ্যমান হবে, মূলশব্দটির জন্য ধন্যবাদ __block। বিপরীতে, ব্লকটি সংশোধন করতে পারে localCharacterএবং এই পরিবর্তনটি ব্লকের বাইরে দৃশ্যমান।


8
দুর্দান্ত, সংক্ষিপ্ত ব্যাখ্যা এবং একটি খুব সহায়ক উদাহরণ। ধন্যবাদ!
ইভান স্টোন

1
অ্যাব্লক কীভাবে লোকাল কাউন্টারকে সংশোধন করে? এটি কেবল কাউন্টারগ্লোবালকে সংশোধন করে বলে মনে হচ্ছে। ধন্যবাদ
CommaToast

8
এটি সংশোধন করে না localCounter, তবে এটি সংশোধন করে localCharacter। এছাড়াও, localCounterব্লকের মানটির দিকে মনোযোগ দিন : এটি 42, যদিও ব্লকটি বলার আগে ভেরিয়েবলটি বৃদ্ধি পেয়েছিল তবে ব্লকটি তৈরি হওয়ার পরে (এটি যখন মানটি "ক্যাপচার" হয়ে যায়)।
ডার্কডাস্ট

1
এটি একটি সহায়ক ব্যাখ্যা - যদিও - আপনি কী ব্যাখ্যা করতে পারেন যা আপনার ব্যাখ্যাতে পরস্পরবিরোধী বক্তব্য বলে মনে হচ্ছে? আপনি উপরে বলেছেন যে "অ্যাব্লক পরিবর্তন করে ... স্থানীয়কৌনটার" এবং তারপরে আপনার মন্তব্যগুলিতে "" এই ব্লক] লোকালকাউন্টারে সংশোধন করে না "" ইহা কোনটা? যদি এটি "সংশোধিত না হয়" তবে আপনার উত্তরটি কি সম্পাদনা করা উচিত?
প্রক্সাইটেলস

2
সাধারণভাবে, __ block ব্যতীত ভারগুলি মান দ্বারা ক্যাপচার করা হবে এবং ব্লকটি তৈরি হওয়ার পরে ব্লকের "পরিবেশ" এ প্যাক করা হবে। তবে __ ব্লক ওয়ারগুলি ক্যাপচার করা হবে না, যখনই এগুলি কোনও ব্লকের অভ্যন্তরে বা বাইরে ব্যবহার করা হবে, সেগুলি যেমন আছে তেমনই উল্লেখ করা হবে।
jchnxu

27

@ ব্লুম একটি ব্লগ পোস্টে ব্লকগুলিকে গভীরতার সাথে কভার করে এবং __ ব্লক স্টোরেজ ধরণের উপর স্পর্শ করে।

__ ব্লক একটি পৃথক স্টোরেজ প্রকার

স্ট্যাটিক, অটো এবং অস্থির মতো ঠিক __ ব্লক হ'ল স্টোরেজ প্রকার। এটি কম্পাইলারকে বলে যে ভেরিয়েবলের স্টোরেজটি অন্যভাবে পরিচালনা করতে হয়।

...

তবে __ ব্লক ভেরিয়েবলের জন্য, ব্লকটি ধরে রাখা যায় না। প্রয়োজন হিসাবে ধরে রাখা এবং ছেড়ে দেওয়া আপনার উপর নির্ভর করে।
...

ব্যবহারের ক্ষেত্রে হিসাবে আপনি খুঁজে পেতে পারেন __blockকখনও কখনও ধরে রাখার চক্র এড়ানোর জন্য ব্যবহৃত হয় কারণ এটি যুক্তি ধরে রাখে না। একটি সাধারণ উদাহরণ স্ব ব্যবহার করে।

//Now using myself inside a block will not 
//retain the value therefore breaking a
//possible retain cycle.
__block id myself = self;

বর্ধিত চক্র সমস্যা সম্পর্কে আরও তথ্যের জন্য এই পোস্টটি দেখুন: benscheimar.com/2012/01/… । চান __weakভাল হিসাবে এই নির্দিষ্ট ক্ষেত্রে যথেষ্ট? এটি সম্ভবত আরও পরিষ্কার ...
হরি করম সিং

17
পরিশেষে দাবি যে __ ব্লকটি শক্তিশালী রেফারেন্স চক্র এড়াতে ব্যবহার করা যেতে পারে (ওরফে ধরে রাখা চক্র) একটি এআরসি প্রসঙ্গে একেবারেই ভুল। এআরসি __ block এ ভেরিয়েবলকে দৃ strongly়ভাবে উল্লেখ করার কারণে, আসলে এগুলির কারণ হওয়ার সম্ভাবনা বেশি। stackoverflow.com/a/19228179/189006
কৃষ্ণন

10

সাধারণত আপনি যখন __ block ব্যবহার করবেন না তখন ব্লকটি ভেরিয়েবলটি অনুলিপি করে (ধরে রাখবে), সুতরাং আপনি ভেরিয়েবলটি পরিবর্তন করেও ব্লকের পুরানো অবজেক্টটিতে অ্যাক্সেস রয়েছে।

NSString* str = @"hello";
void (^theBlock)() = ^void() {
    NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints @"hello"

এই 2 টি ক্ষেত্রে আপনার __ block প্রয়োজন:

1. আপনি যদি ব্লকের ভিতরে ভেরিয়েবলটি পরিবর্তন করতে চান এবং এটি বাইরে দৃশ্যমান হবে বলে আশা করেন:

__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
    str = @"how are you";
};
theBlock();
NSLog(@"%@", str); //prints "how are you"

২. যদি আপনি ব্লকটি ঘোষণার পরে আপনি পরিবর্তনশীলটি পরিবর্তন করতে চান এবং আপনি ব্লকটি পরিবর্তনটি দেখতে আশা করছেন:

__block NSString* str = @"hello";
void (^theBlock)() = ^void() {
    NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints "how are you"

8

__ block হল স্টোরেজ কোয়ালিফায়ার যা দুটি উপায়ে ব্যবহার করা যেতে পারে:

  1. মূল ভেরিয়েবলের লেজিক স্কোপ এবং সেই সুযোগের মধ্যে ঘোষিত যে কোনও ব্লকের মধ্যে ভাগ করা কোনও স্টোরেজে একটি পরিবর্তনশীলের জীবনযাপন চিহ্নিত করে। এবং ঝনঝন এই ভেরিয়েবলটি উপস্থাপনের জন্য একটি কাঠামো উত্পন্ন করবে এবং এই কাঠামোটি রেফারেন্স দ্বারা (মান অনুসারে নয়) ব্যবহার করবে।

  2. এমআরসি-তে, __ block ব্যবহার করে অবজেক্ট ভেরিয়েবলগুলি একটি ব্লক ক্যাপচার এড়ানোর জন্য ব্যবহার করা যেতে পারে। এটি ARC এর পক্ষে কাজ করে না তা সাবধান। এআরসি-তে, আপনার পরিবর্তে __ উইক ব্যবহার করা উচিত ।

বিস্তারিত তথ্যের জন্য আপনি আপেল ডকটি দেখতে পারেন ।


6

__blockস্কোপ ভেরিয়েবলকে পরিবর্তনযোগ্য হিসাবে পরিবর্তনযোগ্য করে তুলতে ব্যবহার করার মতো স্টোরেজ প্রকার, আরও স্পষ্টভাবে যদি আপনি এই স্পেসিফায়ারটির সাহায্যে কোনও ভেরিয়েবল ঘোষণা করেন তবে এর রেফারেন্সটি কেবলমাত্র পড়ার জন্য অনুলিপিগুলিতেই পাস করা হবে আরও আইওএসে ব্লকস প্রোগ্রামিং দেখুন


2

আশা করি এটা তোমাকে সাহায্য করবে

ধরা যাক আমাদের মতো কোড রয়েছে:

{
     int stackVariable = 1;

     blockName = ^()
     {
      stackVariable++;
     }
}

এটি "ভেরিয়েবল অ্যাসাইনযোগ্য নয়" এর মতো একটি ত্রুটি দেয় কারণ ব্লকের অভ্যন্তরে স্ট্যাক ভেরিয়েবলটি ডিফল্টরূপে অপরিবর্তনীয়।

এর ঘোষণার আগে __ block (স্টোরেজ মডিফায়ার) যুক্ত করা একে ব্লকের অভ্যন্তরে পরিবর্তিত করে তোলে ie __block int stackVariable=1;


1

থেকে ব্লক ভাষা ফটকা খেলা :

নতুন ব্লক প্রকারের পাশাপাশি আমরা স্থানীয় ভেরিয়েবলের জন্য একটি নতুন স্টোরেজ কোয়ালিফায়ার, __ block প্রবর্তন করি। [টেস্টেম: একটি ব্লক আক্ষরিকের মধ্যে একটি __ব্লক ঘোষণা] __ ব্লক স্টোরেজ কোয়ালিফায়ার বিদ্যমান স্থানীয় স্টোরেজ কোয়ালিফায়ার অটো, রেজিস্ট্রার এবং স্ট্যাটিকের জন্য পারস্পরিকভাবে একচেটিয়া [[টেস্টেম] ভেরিয়েবলগুলি __ block দ্বারা যোগ্য হয়ে উঠেছে যেন তারা বরাদ্দকৃত স্টোরেজে থাকে এবং এই স্টোরেজটি ভেরিয়েবলের শেষ ব্যবহারের পরে স্বয়ংক্রিয়ভাবে পুনরুদ্ধার হবে। একটি বাস্তবায়ন একটি অপ্টিমাইজেশন চয়ন করতে পারে যেখানে স্টোরেজটি প্রাথমিকভাবে স্বয়ংক্রিয় হয় এবং কেবলমাত্র একটি রেফারেন্সিং ব্লকের ব্লক_কপির উপরে বরাদ্দ (হিপ) সঞ্চয়স্থানে কেবল "সরানো" হয়। এ জাতীয় ভেরিয়েবলগুলি পরিবর্তনশীল হিসাবে পরিবর্তন হতে পারে।

ক্ষেত্রে যখন একটি __ block ভেরিয়েবল একটি ব্লক হ'ল অবশ্যই ধরে নিতে হবে যে __ ব্লক ভেরিয়েবল বরাদ্দকৃত সঞ্চয়স্থানে থাকে এবং যেমন বরাদ্দকৃত স্টোরেজে থাকা কোনও ব্লকের রেফারেন্স হিসাবে ধরে নেওয়া হয় (এটি একটি ব্লক_কপি অপারেশনের ফলাফল)। এটি সত্ত্বেও যদি কোনও বাস্তবায়ন ব্লকগুলির জন্য প্রাথমিক স্বয়ংক্রিয় স্টোরেজ সরবরাহ করে তবে একটি ব্লক_কপি বা একটি ব্লক_রেইজ করার কোনও বিধান নেই। অংশীদারি ভেরিয়েবল আপডেট করার চেষ্টা করার জন্য বেশ কয়েকটি থ্রেডের সহজাত জাতি শর্তের কারণে এবং পুরানো মানগুলি নিষ্পত্তি করতে এবং নতুনগুলি অনুলিপি করার আশেপাশের সুসংগত প্রয়োজনের কারণে এটি ঘটেছে। এই জাতীয় সিঙ্ক্রোনাইজেশন এই ভাষা নির্দিষ্টকরণের সুযোগের বাইরে beyond

একটি __ ব্লক ভেরিয়েবল কী সংকলন করবে সে সম্পর্কে বিশদের জন্য, ব্লক বাস্তবায়ন অনুচ্ছেদ, বিভাগ 2.3 দেখুন।


আপনার লিঙ্কগুলি উভয়ই মারা গেছে
বেন লেগজিওর

এটি সত্যই কোনও উত্তর নয় এবং এটিকে ছিটকে বা সরানো যেতে পারে। ধন্যবাদ!
ড্যান রোজনস্টার্ক

0

এর অর্থ এটি হল যে ভেরিয়েবল এটি একটি উপসর্গ যা কোনও ব্লকের মধ্যে ব্যবহারের জন্য উপলব্ধ।

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