একটি ব্লকের বাইরে কোনও ভেরিয়েবল একটি ব্লকের বাইরে ভেরিয়েবল বরাদ্দ করুন


381

আমি একটি ত্রুটি পাচ্ছি

ভেরিয়েবল বরাদ্দযোগ্য নয় (অনুপস্থিত __ ব্লক ধরণের স্পেসিফায়ার)

লাইনে aPerson = participant;। আমি কীভাবে নিশ্চিত করতে পারি যে ব্লকটি aPersonভেরিয়েবলটি অ্যাক্সেস aPersonকরতে পারে এবং ভেরিয়েবলটি ফিরে আসতে পারে?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;

উত্তর:


779

আপনার সমস্যা সমাধানের জন্য আপনাকে কোডের এই লাইনটি ব্যবহার করতে হবে:

__block Person *aPerson = nil;

আরও বিশদের জন্য দয়া করে এই টিউটোরিয়ালটি দেখুন: ব্লক এবং ভেরিয়েবল


101
দয়া করে মনে রাখবেন যে দুটি আন্ডারস্কোর __blockসহ উপসর্গযুক্ত।
এরিক ব্রোটো

12
__blockআমার ত্রুটি ব্যবহার করে চলে গেছে, তবে মানটি ব্লক থেকে যায় না। এখানে কোনও সহায়তা
ব্যবহারকারী 16119012

7
ব্লকটি যেখানে কল করা উচিত বলে মনে হচ্ছে সেখানে ভাল বলা হয়, অন্য কথায়, ব্লকগুলি 'এখনই চলে না'।
টম অ্যান্ডারসন

1
যদি ব্লকগুলি এখনই ঠিকমতো চালাচ্ছে না তবে এই উত্তরটি গ্রহণ করা উচিত নয় কারণ এটি একটি বিশাল চুক্তি ভঙ্গকারী।
durazno

3
এই উত্তর পোস্ট করা প্রশ্নের ক্ষেত্রে সঠিক, আপনার মনে ভিন্ন পরিস্থিতি থাকলে অন্য প্রশ্নটি নির্দ্বিধায় মনে করুন।
দেবর্ষি

40

আমি নিজেও একটি ভুলের স্মারক হয়েছি the

 __block

প্রথমে ভেরিয়েবলটি ঘোষণার সময় অবশ্যই ডিক্লেয়ারেশন করতে হবে, এটি হ'ল ব্লকের আউটসাইড, এর ভিতরে নয়। ভেরিয়েবলটি ব্লকের বাইরে তার মান ধরে না রাখার বিষয়ে মন্তব্যগুলিতে উল্লিখিত সমস্যাগুলির সমাধান করা উচিত।


18

__blockকোনও ব্লকের অভ্যন্তরে যে কোনও ধরণের ভেরিয়েবল ঘোষনা ও নির্ধারণ করতে কেবল উপসর্গটি ব্যবহার করুন ।

উদাহরণ স্বরূপ:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

ব্লকের অভ্যন্তরে কোনও ভেরিয়েবল নির্ধারণের জন্য যা ব্লকের বাইরে সর্বদা __ block সুনির্দিষ্ট ব্যবহার করে সেই ভেরিয়েবলটির আগে আপনার কোডটি এমন হওয়া উচিত: -

__block Person *aPerson = nil;


3

__weakঅন্য ব্যবহার রক্ষণ সম্পর্কে কোনও সতর্কতা পেলে চেষ্টা করুন__block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

এখন আপনি weakPersonব্লকের ভিতরে অবজেক্টটি উল্লেখ করতে পারেন ।


3

হ্যাঁ ব্লক সর্বাধিক ব্যবহৃত কার্যকারিতা, তাই ধরে রাখার চক্র এড়ানোর জন্য আমাদের ব্লকের অভ্যন্তরে স্বতন্ত্র সহ শক্তিশালী পরিবর্তনশীলটি এড়ানো উচিত, _উইক বা দুর্বলতা ব্যবহারের অনুপ্রেরণা জানানো উচিত।


0

আমি যখন একই ত্রুটিটি দেখেছি তখন এটির মতো সমাধান করার চেষ্টা করেছি:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

এবং এটি কাজ করে

চলক এর আগে কেবল " __ block " যুক্ত করুন ।

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