আমি কখন উদ্দেশ্য ও সি-তে শূন্য ও নল ব্যবহার করব?


170

এটি নমুনা কোড:

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

কখন আমাকে শূন্য, নুল এবং [এনএসএন নাল] ব্যবহার করা উচিত?


4
এটি উদ্দেশ্য সি প্রশ্নের সাথে সম্পর্কিত।
বিরানচি

nilঅর্থ এক ধরণের NULLঅবজেক্ট উদাহরণস্বরূপ। সুতরাং আপনি নির্দিষ্ট মানটি চিহ্নিত করতে পারেন উদ্দেশ্য বা উদাহরণস্বরূপ জেনেরিক পয়েন্টারের জন্য। প্রকার পরিচালনা এবং সুরক্ষার দৃষ্টিতে এটি আপনাকে অনেক সহায়তা করবে।
eonil

4
nilএবং null/ NULLদুটি একই - উভয়ই শূন্য হিসাবে সংজ্ঞায়িত। আনুষ্ঠানিকতা হিসাবে, nilউদ্দেশ্য-সি কোড করার সময় এবং NULLনিয়মিত সি / সি ++ স্টেটমেন্ট / কল কোডিং করার সময় ব্যবহার করুন । NSNullতবে সম্পূর্ণ ভিন্ন কিছু। এটি একটি সিঙ্গলটন অবজেক্ট যা স্থানধারক হিসাবে "কিছুই না" উপস্থাপনের জন্য কাজ করে, যেমন এনএসডিকোরিয়ান্স যেখানে শূন্য / নাল পয়েন্টার অনুমোদিত নয়।
হট লিক্স

সুস্পষ্ট ব্যাখ্যার জন্য লিঙ্কটি দেখুন [এখানে] [১] [১]: স্ট্যাকওভারফ্লো.com
আমির

উত্তর:


114

আপনি ব্যবহার করতে পারেন nilযে কোন জায়গায় আপনি ব্যবহার করতে পারেন সম্পর্কে null। মূল পার্থক্য হ'ল আপনি বার্তাগুলি প্রেরণ করতে পারেন nil, তাই আপনি এটি এমন কিছু জায়গায় ব্যবহার করতে পারেন যেখানে nullক্যান্ট কাজ করে না।

সাধারণভাবে, কেবল ব্যবহার করুন nil


12
প্রযুক্তিগতভাবে, এগুলি হুবহু সমান, আপনি শূন্য এবং নাল উভয়কে বার্তা পাঠাতে পারেন। আইডোম্যাটিকভাবে যদিও
শূন্যপদটি

41
এছাড়াও, ম্যাকটাইপস.-এ আছে#define nil NULL
14:48

8
হ্যাঁ, কোবাল যেমন বলে, তারা একই রকম। এটি আরও প্রাসঙ্গিক রেফারেন্স যেখানে NUL 0x0 এর পয়েন্টার, শূন্য একটি অস্তিত্বহীন উদ্দেশ্য-সি অবজেক্ট এবং নীল একটি অস্তিত্বহীন উদ্দেশ্য-সি শ্রেণি, তবে প্রযুক্তিগতভাবে তারা সব ঠিক 0 হয়। এছাড়াও, এটি NULL নয় নাল - নাল জাভা বা সি # তে তবে উদ্দেশ্য-সি তে নয়।
জেসন কোকো

16
এই গৃহীত উত্তরটি স্বীকৃতি দিতে ব্যর্থ হয়েছে যে [NSNull null]এটি একটি খুব আলাদা জন্তু। এনএসনুল ক্লাস রেফারেন্সের উদ্ধৃতি হিসাবে , "এনএসনুল শ্রেণি সংগ্রহের বস্তুগুলিতে নাল মানগুলিকে উপস্থাপন করতে ব্যবহৃত একটি সিঙ্গলটন অবজেক্টকে সংজ্ঞায়িত করে (যা শূন্য মানের মান দেয় না)"। সংখ্যা এবং মান প্রোগ্রামিং বিষয়গুলির NSNull বিভাগটি ব্যবহার করে দেখুন
রব

"মূল পার্থক্য হ'ল আপনি শূন্য বার্তাগুলি প্রেরণ করতে পারেন" - আপনি বার্তা প্রেরণও করতে পারেন NULL

313

তারা তাদের ধরণের মধ্যে পৃথক। এগুলি সব শূন্য, তবে NULLএটি একটি void *, nilএকটি id, এবং Nilশ্রেণি নির্দেশক।


14
পার্থক্যটি সম্পর্কে আমি সবচেয়ে ভাল ব্যাখ্যা শুনেছি (: ধন্যবাদ।
জ্যাকব

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, বেশি ভোট দেওয়ার কারণে নয়, কারণ এটি উত্থাপিত প্রশ্নের সর্বোত্তম ব্যাখ্যা রয়েছে।
জেমস মের্টজ

5
NULLভি এর মার্জিত বর্ণনা nil, কিন্তু এটি মারাত্মকভাবে চিহ্নটিকে মিস করে [NSNull null]। দেখুন NSNull ব্যবহার বিভাগে নম্বর এবং মূল্য প্রোগ্রামিং টপিক এবং NSNull ক্লাস রেফারেন্স
রব

উভয়ই পয়েন্টার বলে মনে হচ্ছে void *। এখানে একটি ভিন্ন উত্তর ইতিমধ্যে এর উল্লেখ করেছে, তবে আপনি যদি খনন করেন তবে আপনি objc.hলাইনটি খুঁজে পাবেন #define nill __DARWIN_NULL
gkb0986

1
এই উত্তরটি ভাল শোনাচ্ছে তবে অন্যান্য উত্তর অনুসারে এটি কেবল ভুল।
n13

30

শূন্য আবদ্ধ / একটি বস্তু (উদ্দেশ্য সি মধ্যে আইডি প্রকার) সঙ্গে সংশ্লিষ্ট একটি খালি মান। শূন্য কোন রেফারেন্স / ঠিকানা, শুধু একটি মান খালি পেয়েছিলাম।

NSString *str = nil;

সুতরাং শূন্য ব্যবহার করা উচিত, যদি আমরা কোনও বস্তুর সাথে ডিল করি।

if(str==nil)
    NSLog("str is empty");

এখন NULL অবজেক্ট -সি-তে অ-অবজেক্ট পয়েন্টার (সি পয়েন্টারের মতো) জন্য ব্যবহৃত হয় for শূন্য মত , NULL কোন মূল্য বা ঠিকানা পেয়েছে।

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

সুতরাং যদি কোনও পরিস্থিতি থাকে, যখন আমার স্ট্রাক্ট (কাঠামোর ধরণের ভেরিয়েবল) খালি আছে কিনা তা পরীক্ষা করতে হবে, তখন আমি ব্যবহার করব:

if (dStruct == NULL)
    NSLog("The struct is empty");

এর আরেকটি উদাহরণ দেওয়া যাক

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

এর কী-মান পর্যবেক্ষণ , প্রসঙ্গ একটি সি পয়েন্টার অথবা একটি অবজেক্ট রেফারেন্স হওয়া উচিত। এখানে প্রসঙ্গে আমরা শূন্য ব্যবহার করতে পারি না ; আমাদের নুল ব্যবহার করতে হবে ।

অবশেষে এনএসনুল শ্রেণি সংগ্রহের বস্তুগুলিতে নাল মানগুলিকে উপস্থাপন করতে ব্যবহৃত একক সিঙ্গলটন অবজেক্টকে সংজ্ঞায়িত করে (এনএসআররে, এনএসডি অভিধান)। [NSNull নাল] হবে আয় NSNull এর Singleton উদাহরণস্বরূপ। মূলত [এনএসনুল নাল] একটি সঠিক অবজেক্ট।

সংগ্রহের ধরণের অবজেক্টে নীল বস্তুটি sertোকানোর কোনও উপায় নেই। আসুন একটি উদাহরণ দেওয়া যাক:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

দ্বিতীয় লাইনে আমরা কোনও ত্রুটি পাব না, কারণ কোনও সংগ্রহ টাইপ অবজেক্টে কোনও এনএসএনল বস্তু সন্নিবেশ করা পুরোপুরি ন্যায্য। তৃতীয় লাইনে, আমরা "অবজেক্ট শূন্য হতে পারে না" ত্রুটি পেয়ে যাব। কারণ শূন্য একটি বস্তু নয়।


অ্যারেতে শূন্য / নাল ব্যবহারিক ব্যবহারের উল্লেখ করার জন্য +1।
মাইকেল

19

NULL এবং শূন্যস্থান একে অপরের সমান, তবে শূন্য একটি বস্তুর মান হয় যখন NULL একটি জেনেরিক পয়েন্টার মান হয় ( (void*)0নির্দিষ্ট করে বলা যায়)। [NSNull null]এমন একটি বস্তু যা এমন পরিস্থিতিতে নীলকে দাঁড় করানো বোঝায় যেখানে নীল অনুমতি নেই। উদাহরণস্বরূপ, আপনার কোনও এনএসআর্রে শূন্য মান থাকতে পারে না। সুতরাং আপনার যদি "শূন্য" প্রতিনিধিত্ব করতে হয়, আপনি ব্যবহার করতে পারেন [NSNull null]


12

আমি নিম্নলিখিতটি পেয়েছি:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

এটি যেভাবে দেখায়, একটি ধারণাগত একটি ছাড়া কোনও পার্থক্য নেই।



7

তারা উভয়ই টাইপকাস্ট শূন্যের। কার্যত, তাদের মধ্যে কোনও পার্থক্য নেই। অর্থাত।,

#define NULL ((void*)0)
#define nil ((id)0)

একটি পার্থক্য রয়েছে, তবে কেবল নিজের এবং অন্যান্য মানবদের মধ্যে যারা কোডটি পড়েছেন, সংকলকটির কোনও যত্ন নেই।

আর একটি বিষয় শূন্য হ'ল একটি বস্তুর মান এবং NULL একটি জেনেরিক পয়েন্টার মান।


6

আধুনিক ওএস এক্স এবং আইওএস এসডিকেগুলিতে:

  • nilএবং Nilএবং NULLঅবজেক্টিভ-সি এবং সি ++ 11 এর আগে উদ্দেশ্য-সি ++ তে অভিন্ন।
  • nilএবং Nilএবং std::nullptrসি ++ 11 এর সাথে উদ্দেশ্য-সি ++ তে অভিন্ন ident

শৈলীগত অনেকেই ব্যবহার করতে পছন্দ nilউদ্দেশ্য সি অবজেক্টের জন্য এবং NULLবা nullptrঅন্যান্য পয়েন্টার ধরনের জন্য। আমি নিজেই এখন nilসর্বত্র ব্যবহার করি ।

[NSNull null]এমন পরিস্থিতিতে সিঙ্গলটন অবজেক্ট হ'ল নাল মানগুলিকে প্রতিনিধিত্ব করতে যেখানে nilমান হিসাবে নিষিদ্ধ করা হয় (সাধারণত কোনও সংগ্রহ সামগ্রীতে যেমন একটি NSArrayবা NSDictionary)। সংখ্যা এবং মান প্রোগ্রামিংয়ের বিষয়: এনএসএনল ব্যবহার করে



4

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

উদ্দেশ্য-সি সম্পর্কিত সমস্ত কিছুর জন্য আমি শূন্য ব্যবহার করি। উদাহরণ স্বরূপ:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

যাইহোক, সি-ফ্রেমওয়ার্ক (যেমন ঠিকানাবুক ফ্রেমওয়ার্ক এবং কোরফাউন্ডেশন) থেকে ডেটা মডেলের বৈধতা যাচাই করার সময়, আমি নুল ব্যবহার করি। উদাহরণ স্বরূপ:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

এইভাবে, আমার কোডে সূক্ষ্ম সূত্র রয়েছে যদি আমি ওবজ-সি বা সি ভিত্তিক কোডটি ব্যবহার করি।


4

শূন্য কিছুই একটি বস্তু পয়েন্টার। যদিও NULL থেকে শব্দার্থগতভাবে পৃথক , তারা প্রযুক্তিগতভাবে একে অপরের সমতুল্য

ফ্রেমওয়ার্ক স্তরে, ফাউন্ডেশন এনএসনুলকে সংজ্ঞায়িত করে , যা একটি শ্রেণি পদ্ধতি, + নালকে সংজ্ঞায়িত করে , যা সিঙ্গলটন এনএসনুল অবজেক্টকে প্রদান করে। NSNull থেকে ভিন্ন শূন্য বা শূন্য যে এটি একটি হল, প্রকৃত বস্তু , বরং একটি শূন্য মানের চেয়ে।

উপরন্তু, ফাউন্ডেশন / NSObjCRuntime.h এ, নীল একটি হিসাবে সংজ্ঞায়িত করা হয় বর্গ পয়েন্টার কিছুই।

আরও তথ্যের জন্য এটি পড়ুন - শূন্য / নীল / নুল / এনএসএন


3

কিছু প্রসঙ্গে একটি পার্থক্য আছে।

আক্ষরিক অর্থে নুল একটি চরিত্র: ASCII 0।

নিল ফাঁকা সমান, কোনও মূল্য নেই।

প্রোগ্রামিং প্রসঙ্গে উপর নির্ভর করে, এটি একটি বড় পার্থক্য হতে পারে।


1

উদাহরণস্বরূপ NUL ব্যবহার করুন যখন আপনি টাইপের আউটপুট প্যারামিটার (এনএসইরর **) এর সাথে একটি উদ্দেশ্য-সি পদ্ধতি শুরু করেন।

আমি ওয়েবে প্রচুর উদাহরণ কোড দেখতে পাচ্ছি যেখানে লোকেরা এই ক্ষেত্রে NULL এর পরিবর্তে শূন্য করে। এটি কারণ এটি একটি পয়েন্টার একটি পয়েন্টার এবং এইভাবে একটি উদ্দেশ্য-সি অবজেক্ট টাইপ না। উপরে যেমন বলা হয়েছে, নিলটি উদ্দেশ্য-সি অবজেক্টের ধরণের জন্য ব্যবহার করা উচিত।


1

মূলত: শূন্য: কোনও বস্তুর নাল পয়েন্টার এবং নাল: অন্য ধরণের পয়েন্টারের জন্য


0

শূন্য মানে হ'ল মানের অনুপস্থিতি যখন NUL কোনও বস্তুর প্রতিনিধিত্ব করে না,

এনএসআরএ * অ্যারে = @ [@ "হ্যালো ওয়ার্ল্ড!", @ 101, [এনএসএনএলএল নাল]];

এখানে [এনএসএনইউএল নাল] হ'ল একটি অবজেক্ট যার অর্থ কোনও বস্তু নয়, একই সাথে আপনি অবজেক্টের অনুপস্থিতি নির্দেশ করতে শূন্য করতে পারবেন না।

আপনি খুব চেক করার জন্য নীল এবং [এনএসএনউল নাল] উভয়ই ব্যবহার করতে পারেন।


0

এটি আপনাকে শূন্য, নীল এবং শূন্যের মধ্যে পার্থক্য বুঝতে সাহায্য করবে।

নীচের লিঙ্কটি আপনাকে কোনও উপায়ে সহায়তা করতে পারে:

http://nshipster.com/nil/

শূন্য -> উদ্দেশ্য সি-অবজেক্টের জন্য আক্ষরিক নাল মান।

নিল -> উদ্দেশ্য-সি ক্লাসের জন্য আক্ষরিক নাল মান।

নাল -> সি পয়েন্টারগুলির জন্য আক্ষরিক নাল মান।

NSNULL -> সিঙ্গলটন অবজেক্ট নাল প্রতিনিধিত্ব করতে ব্যবহৃত।


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