"@ গোপনীয়তা" এর অর্থ উদ্দেশ্য সি-এর অর্থ কী?


উত্তর:


186

এটা একটা ব্যাপার দৃশ্যমানতা পরিবর্তক -এটা মানে যে দৃষ্টান্ত ভেরিয়েবল ঘোষণা যেমন @privateশুধুমাত্র অ্যাক্সেস করতে পারবেন একই ক্লাসের দৃষ্টান্ত । ব্যক্তিগত সদস্যদের সাবক্লাস বা অন্যান্য ক্লাস দ্বারা অ্যাক্সেস করা যায় না।

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

@interface MyClass : NSObject
{
    @private
    int someVar;  // Can only be accessed by instances of MyClass

    @public
    int aPublicVar;  // Can be accessed by any object
}
@end

এছাড়াও, স্পষ্ট করার জন্য, উদ্দেশ্যগুলি সর্বদা উদ্দেশ্য-সিতে সর্বজনীন। "গোপন" পদ্ধতি ঘোষণার উপায় রয়েছে, যদিও more আরও তথ্যের জন্য এই প্রশ্নটি দেখুন।


@ কার্যকরকরণের পরে বন্ধনীগুলিতে থাকা উদাহরণ ভেরিয়েবলগুলি সম্পর্কে কী? তারা সবসময় ব্যক্তিগত হয়?
জন হেন্কেল

আমি জানি এটি পুরানো ... তবে এটি দৃশ্যমানতা পরিবর্তনকারী নয়। এটি একটি অ্যাক্সেস মডিফায়ার। এটি সি ++ এ আরও গুরুত্বপূর্ণ পার্থক্য, তবে এটি উদ্দেশ্য-সিতেও একটি আলাদা পার্থক্য। চলকটি সংকলকটিতে দৃশ্যমান। সংকলকটি আপনাকে এটি অ্যাক্সেস করতে দেয় না।
gnasher729

161

যেমনটি এইচটিডাব্লু বলেছে, এটি একটি ভিজিবিলিটি মডিফায়ার। @privateএর অর্থ এই যে ivar (উদাহরণ পরিবর্তনশীল) কেবল একই শ্রেণীর উদাহরণের মধ্যে থেকে সরাসরি অ্যাক্সেস করা যায়। যাইহোক, এটি আপনার পক্ষে বেশি অর্থ নাও পেতে পারে, তাই আমি আপনাকে একটি উদাহরণ দিই। আমরা initক্লাসের পদ্ধতিগুলি সরলতার জন্য উদাহরণ হিসাবে ব্যবহার করব । আমি আগ্রহের আইটেমগুলি নির্দেশ করতে ইনলাইন মন্তব্য করব।

@interface MyFirstClass : NSObject
{
    @public
    int publicNumber;

    @protected  // Protected is the default
    char protectedLetter;

    @private
    BOOL privateBool;
}
@end

@implementation MyFirstClass
- (id)init {
    if (self = [super init]) {
        publicNumber = 3;
        protectedLetter = 'Q';
        privateBool = NO;
    }
    return self;
}
@end

@interface MySecondClass : MyFirstClass  // Note the inheritance
{
    @private
    double secondClassCitizen;
}
@end

@implementation MySecondClass
- (id)init {
    if (self = [super init]) {
        // We can access publicNumber because it's public;
        // ANYONE can access it.
        publicNumber = 5;

        // We can access protectedLetter because it's protected
        // and it is declared by a superclass; @protected variables
        // are available to subclasses.
        protectedLetter = 'z';

        // We can't access privateBool because it's private;
        // only methods of the class that declared privateBool
        // can use it
        privateBool = NO;  // COMPILER ERROR HERE

        // We can access secondClassCitizen directly because we 
        // declared it; even though it's private, we can get it.
        secondClassCitizen = 5.2;  
    }
    return self;
}

@interface SomeOtherClass : NSObject
{
    MySecondClass *other;
}
@end

@implementation SomeOtherClass
- (id)init {
    if (self = [super init]) {
        other = [[MySecondClass alloc] init];

        // Neither MyFirstClass nor MySecondClass provided any 
        // accessor methods, so if we're going to access any ivars
        // we'll have to do it directly, like this:
        other->publicNumber = 42;

        // If we try to use direct access on any other ivars,
        // the compiler won't let us
        other->protectedLetter = 'M';     // COMPILER ERROR HERE
        other->privateBool = YES;         // COMPILER ERROR HERE
        other->secondClassCitizen = 1.2;  // COMPILER ERROR HERE
    }
    return self;
}

সুতরাং আপনার প্রশ্নের উত্তরের জন্য, @ ব্যক্তিগতভাবে অন্য কোনও শ্রেণীর উদাহরণ দিয়ে ivars অ্যাক্সেস থেকে রক্ষা করে। নোট করুন যে মাই ফার্স্টক্লাসের দুটি উদাহরণ একে অপরের আইভারগুলিতে সরাসরি অ্যাক্সেস করতে পারে; ধারণা করা হয় যেহেতু প্রোগ্রামারটির সরাসরি এই শ্রেণীর উপর সম্পূর্ণ নিয়ন্ত্রণ রয়েছে, তাই তিনি এই ক্ষমতাটি বুদ্ধিমানের সাথে ব্যবহার করবেন।


20
এটি উল্লেখ করা উচিত যে অবজেক্টিভ-সিতে @ সর্বজনীন, @ সমর্থিত এবং @ গোপনীয়তা ব্যবহার করা অস্বাভাবিক। পছন্দসই পদ্ধতির হ'ল সর্বদা অ্যাক্সেসর ব্যবহার করা।
জর্জি স্কলি

1
@ জর্জি, তবে আপনি কীভাবে অ্যাক্সেসরের ব্যবহার প্রয়োগ করবেন যদি না আপনি আপনার আইভরকে সীমাবদ্ধ দৃশ্যমানতার সাথে চিহ্নিত করেন?
গ্রেগ ম্লেটিক

5
@ জর্গ শুলি: যেহেতু xcode 4.x + স্বয়ংক্রিয়ভাবে কোনও জিনিসের @privateজন্য টেমপ্লেটে রাখে , এটি এতটা অস্বাভাবিক নয়।
ডগ

1
@ জর্জি আমি মনে করি @ প্রাইভেট, @ সুরক্ষিত ক্ষেত্রগুলি উত্তরাধিকারের সাথে জড়িত রয়েছে এমন ক্ষেত্রে ব্যবহার করা যেতে পারে, যদিও ব্যক্তিগতভাবে এটি ব্যবহার
করেননি

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

14

যখন কেউ বলে যে আপনি @privateউদাহরণের পরিবর্তনশীল অ্যাক্সেস করতে পারবেন না তখন এর অর্থ কী তা বোঝা গুরুত্বপূর্ণ । আসল কাহিনীটি হ'ল আপনি যদি আপনার উত্স কোডে এই ভেরিয়েবলগুলি অ্যাক্সেস করার চেষ্টা করেন তবে সংকলকটি আপনাকে একটি ত্রুটি দেবে। জিসিসি এবং এক্সকোডের পূর্ববর্তী সংস্করণগুলিতে আপনি একটি ত্রুটির পরিবর্তে কেবল একটি সতর্কতা পেয়ে যাবেন।

যে কোনও উপায়ে, রান সময়ে, সমস্ত বেট বন্ধ আছে। এই @privateএবং @protectedআইভরগুলি যে কোনও শ্রেণীর অবজেক্ট দ্বারা অ্যাক্সেস করা যায়। এই দৃশ্যমানতা সংশোধনকারীগুলি কেবলমাত্র উত্স কোডটি মেশিন কোডে সংকলন করতে অসুবিধা তৈরি করে যা দৃশ্যমানতা সংশোধনকারীদের উদ্দেশ্যকে লঙ্ঘন করে।

সুরক্ষার জন্য আইভার ভিজিবিলিটি সংশোধকগুলির উপর নির্ভর করবেন না! তারা কিছুই প্রদান করে না। তারা শ্রেণি-নির্মাতার ইচ্ছার সংকলন-সময় প্রয়োগের জন্য কঠোরভাবে।

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