উদ্দেশ্য-সি-তে NULL বনাম শূন্য


182

ইন observeValueForKeyPath:ofObject:change:context:- প্রসঙ্গ পয়েন্টারটি নির্দিষ্ট না করার NULLপরিবর্তে ডক্স কেন ব্যবহার করবে nil?


আমার মতে, অবজেক্টটি শূন্য, শ্রেণিটি শূন্য, এবং বস্তু বা শ্রেণীর জন্য NULL ব্যবহার করছে
Thanh Vũ Trần

উত্তর:


227

nilশুধুমাত্র একটি স্থানে ব্যবহার করা উচিত id, আমরা কি জাভা এবং সি ++ প্রোগ্রামারদের একটি অবজেক্ট একটি পয়েন্টার হিসাবে মনে হবে। ব্যবহারNULLঅ-অবজেক্ট পয়েন্টারগুলির জন্য ।

এই পদ্ধতির ঘোষণাটি দেখুন:

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

প্রসঙ্গটি হ'ল একটি void *(যেমন একটি সি-স্টাইল পয়েন্টার), সুতরাং আপনি অবশ্যই NULL(যা টাইপযুক্ত (void *)0) এর পরিবর্তে nil(যা কখনও কখনও হিসাবে ঘোষিত হয় ) ব্যবহার করবেন id


2
কিন্তু যেহেতু ধরণ contextমধ্যে observeValueForKeyPath:ofObject:change:context:হয় void *, না মানে ডাটা হিসাবে পাস যে contextএকটি বস্তু পয়েন্টার হতে পারে? আমি মনে করি এটি একটি সাধারণ ঘটনা হবে। এজন্য আমি কেন বিভ্রান্ত হয়ে পড়েছি যে ডক্স সর্বদা এর NULLপরিবর্তে ব্যবহার করে nil
এরিকপ্রাইস

2
প্রসঙ্গের ধরণ: সেই পদ্ধতিতে "শূন্য *"। "শূন্য" কোনও "শূন্য *" নয়, তবে শূন্যস্থান।
পল টমবলিন

3
আপনি পারেন। অকার্যকর * কোনও পয়েন্টার। তবুও, আপনি একেবারেই ঠিক বলেছেন যে সেখানে NULL সঠিক ধ্রুবক।
পিটার হোসি

3
তারা বলল শূন্য *। শূন্য * অকার্যকর জন্য এবং শূন্য আইডির জন্য হয়। অতএব, আপনি নীল পাস। আপনি যদি শূন্যতা পাস করেন তবে আপনি আপনার পাঠকের কাছে মিথ্যা কথা বলছেন, যিনি ভাবেন যে এই পদ্ধতিটি কোনও আইডি লাগে।
পিটার হোসি

12
বা অন্যভাবে এটি ভাবার জন্য, NULL একটি বিস্তৃত প্রকার, এবং শূন্যস্থান হল NULL এর একটি উপসেট। সাধারণভাবে, আপনি যে প্রস্থান করতে পারেন তার বিস্তৃত ব্যবহার করুন (যেমন জাভাতে, ভেক্টরের পরিবর্তে কোনও সংগ্রহের আশা করার জন্য আপনার পদ্ধতিটি লিখুন, যদি না আপনি ভেক্টর থেকে নির্দিষ্ট কিছু প্রয়োজন হয়)
পল টম্বলিন

65

তারা প্রযুক্তিগতভাবে একই জিনিস (0), তবে শূন্যস্থানটি সাধারণত একটি উদ্দেশ্য-সি অবজেক্ট টাইপের জন্য ব্যবহৃত হয়, যখন সিউল-স্টাইল পয়েন্টার (অকার্যকর *) জন্য NUL ব্যবহৃত হয়।


8
এছাড়াও, NULLচেয়ে পৃথকভাবে সংজ্ঞায়িত করা হয় nilnilহিসাবে সংজ্ঞায়িত করা হয় (id)0NULLনয়।

14
@ ডাব্লুপিটিআই যদি আপনি ম্যাকটাইপস.এইচ মাধ্যমে পড়েন তবে এটি ঘোষিত #
নূন্য

1
এটা খুব আকর্ষণীয়। দেখে মনে হচ্ছে স্টাইল পয়েন্ট ছাড়া এটি অন্য কিছু নয়। এটি হ্যাঁ / সত্য এবং কোনও / মিথ্যা নয়।
ব্রেনান

1
@ ব্রেনান, এটি পুরোপুরি সত্য নয়, কেবল নুলকে নুল হিসাবে সংজ্ঞায়িত করার অর্থ এই নয় যে এই পর্দার আড়ালে কিছু লুকানো বাস্তবায়ন রয়েছে। উদাহরণস্বরূপ, আইবিএક્શનটি অকার্যকর হিসাবে সংজ্ঞায়িত করা হয়েছে তবে বোতাম এবং এর মতো ক্রিয়াগুলির সাথে সংযুক্তির জন্য পদ্ধতিগুলি প্রদর্শন করার সময় ইন্টারফেস বিল্ডার ব্যবহার করার সময় এর আলাদা অর্থ রয়েছে।
মাইকেলাহ ওয়ালেস

53

তারা প্রযুক্তিগতভাবে একই জিনিস এবং শুধুমাত্র শৈলীতে পৃথক:

  • অবজেক্টিভ-সি স্টাইলটি nilহ'ল টাইপটির জন্য কী ব্যবহার করতে হবে id(এবং বস্তুর দিকে নির্দেশক)।
  • সি স্টাইল বলে যে NULLএটি আপনি ব্যবহার করেন void *
  • সি ++ স্টাইল সাধারণত বলে যে আপনার কেবল ব্যবহার করা উচিত 0

আমি সাধারণত সেই রূপটি ব্যবহার করি যা ভাষার সাথে মেলে যেখানে প্রকারটি ঘোষিত হয়েছে


14

NULLহয় C equivalentএরnil , কোনও ইঙ্গিতকারী;

কোথায় nil is zero typed as id,

NULL is zero typed as void*

একটি গুরুত্বপূর্ণ বিষয় আপনি NULL তে কোনও বার্তা প্রেরণ করতে পারবেন না। সুতরাং অনেক জায়গায় উদ্দেশ্য-সিতে শূন্যতা ব্যবহার করা পছন্দ করা হয়।


4

তারা প্রায় একই জিনিস বাদে,

nilএকটি উদ্দেশ্য-সি স্টাইলে ব্যবহৃত হয়। NULLসি টাইপ পয়েন্টারগুলির জন্য কোথায় এবং এটিতে টাইপফাইড হয় (void *)


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