কখন এনএসআইন্টেগার বনাম ইন্ট ব্যবহার করবেন


344

NSIntegerআইওএসের জন্য বিকাশ করার সময় কখন আমি বনাম ইট ব্যবহার করব ? আমি অ্যাপল স্যাম্পল কোডটিতে দেখতে পাচ্ছি যে তারা কোনও ফাংশনে আর্গুমেন্ট হিসাবে কোনও মান পাস করার সময় বা কোনও ফাংশন থেকে কোনও মান ফেরত দেওয়ার সময় তারা NSInteger(বা NSUInteger) ব্যবহার করে।

- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...

তবে একটি ফাংশনের মধ্যে তারা কেবল intএকটি মান ট্র্যাক করতে ব্যবহার করছে

for (int i; i < something; i++)
...

int something;
something += somethingElseThatsAnInt;
...

আমি পড়েছি (বলা হয়েছে) এটি NSIntegerএকটি 64-বিট বা 32-বিট পরিবেশে কোনও পূর্ণসংখ্যার রেফারেন্সের একটি নিরাপদ উপায় তাই কেন মোটেই ব্যবহার করবেন int?

উত্তর:


322

আপনি সাধারণত NSIntegerযখন আপনার কোডটি কী প্রসেসরের আর্কিটেকচারটি চালিত হতে পারে তা জানেন না, তাই আপনি কোনও কারণে সর্বাধিক সম্ভাব্যতম পূর্ণসংখ্যার প্রকারটি চান, যা 32 বিট সিস্টেমে কেবল একটি int, যখন একটি 64-বিট থাকে সিস্টেম এটি একটি long

আপনার বিশেষভাবে প্রয়োজন না হলে আমি / এর NSIntegerপরিবর্তে ব্যবহার করতে থাকব ।intlong

NSInteger/ এই ধরণের একটিতে NSUInteger* গতিশীল typedef* গুলি হিসাবে সংজ্ঞায়িত করা হয় এবং সেগুলি এই জাতীয় সংজ্ঞায়িত করা হয়:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

সঠিক ফর্ম্যাট স্পেসিফায়ার সম্পর্কিত আপনার এই ধরণের প্রতিটি জন্য ব্যবহার করা উচিত, প্ল্যাটফর্ম নির্ভরতা উপর স্ট্রিং প্রোগ্রামিং গাইড এর বিভাগ দেখুন


4
অতিরিক্তভাবে, আমি বলব যে এনএসআইন্টিজার ব্যবহার করা ভাল তবে আপনার বিশেষভাবে ইনট বা লং ইন্টের প্রয়োজন হয়।
v01d

4
@ শিজাম এটি সম্ভব যে একটি ব্যবহার intকরা এমনকি একটির পক্ষে আরও উপযুক্ত long। হতে পারে আপনি জানেন যে এটি কোনও নির্দিষ্ট পরিসীমা অতিক্রম করবে না, এবং তাই সহজেই ব্যবহার করতে এটি আরও মেমরির-দক্ষ হবে বলে মনে করেন int
জ্যাকব রিলকিন

58
আমি এই উত্তরের সাথে একমত নই। আমি যে জিনিসটি ব্যবহার করব তা NSIntegerহ'ল এটি নির্দিষ্ট করে এমন একটি এপিআই থেকে এবং এর থেকে মানগুলি পাস করা। এটি ছাড়া কোনও ইনট বা দীর্ঘেরও কোনও লাভ নেই। অন্তত একটি দীর্ঘ বা দীর্ঘ দিয়ে আপনি জানেন যে কোনও প্রিন্টফ বা অনুরূপ বিবৃতিতে কোন ফর্ম্যাট নির্দিষ্টকরণগুলি ব্যবহার করতে হবে।
জেরেমিপ

3
আপনার যদি একটি store৪ বি সিস্টেমে কাজ করার সময় NSInteger ব্যবহার করার প্রয়োজন হয় তবে অন্য ব্যবহারকারী 32b সিস্টেম ব্যবহার করে আপনার যদি দীর্ঘ সঞ্চয় করতে হয় এবং আপনি NSInteger ব্যবহার করেন তবে কি হবে? আপনি ব্যর্থতা লক্ষ্য করবেন না তবে ব্যবহারকারী তা করবে।
এরিয়েলকামাস

14
এটি পিছনের দিকে। আপনার অন্যথায় নির্দিষ্ট কারণ না থাকলে সর্বদা ইনট ব্যবহার করুন। সাধারণ পূর্ণসংখ্যার জন্য প্ল্যাটফর্ম-নির্দিষ্ট সংজ্ঞা ব্যবহার করা আপনার কোডটি পড়া আরও শক্ত করে তোলে।
গ্লেন মেইনার্ড

44

intআদৌ কেন ব্যবহার করবেন ?

অ্যাপল ব্যবহার করে intকারণ লুপ নিয়ন্ত্রণ ভেরিয়েবলের জন্য (যা কেবল লুপ পুনরাবৃত্তিকে নিয়ন্ত্রণ করতে ব্যবহৃত হয়) intডেটাটাইপ ঠিক আছে, উভয়ই ডেটাটাইপ আকারে এবং মানগুলিতে এটি আপনার লুপের জন্য ধারণ করতে পারে। প্ল্যাটফর্ম নির্ভর ডেটাটাইপের প্রয়োজন নেই। লুপ নিয়ন্ত্রণ ভেরিয়েবলের জন্য এমনকি একটি 16-বিট intবেশিরভাগ সময় করবে।

অ্যাপল NSIntegerএকটি ফাংশন রিটার্ন মান বা একটি ফাংশন আর্গুমেন্টের জন্য ব্যবহার করে কারণ এই ক্ষেত্রে ডেটাটাইপ [আকার] বিষয়টি বিবেচনা করে , কারণ আপনি কোনও ফাংশন দিয়ে যা করছেন তা অন্য প্রোগ্রামগুলির সাথে বা কোডের অন্যান্য টুকরা দিয়ে তথ্য যোগাযোগ করা / পাস করা; উত্তর কখন দেখুন আমি এনএসআইন্টেগার বনাম ইন্ট ব্যবহার করব? আপনার প্রশ্ন নিজেই ...

তারা [অ্যাপল] কোনও ফাংশনে আর্গুমেন্ট হিসাবে কোনও মান পাস করার সময় বা কোনও ফাংশন থেকে কোনও মান ফেরত দেওয়ার সময় এনএসআইঞ্জিগার (বা এনএসইউআইঞ্জার) ব্যবহার করে।


32

ওএস এক্স হ'ল "এলপি 64"। এই যে মানে:

int সর্বদা 32-বিট হয়।

long long সর্বদা 64-বিট হয়।

NSIntegerএবং longসর্বদা পয়েন্টার আকারের হয়। এর অর্থ তারা 32-বিট সিস্টেমে 32-বিট এবং 64-বিট সিস্টেমে 64 বিট।

NSInteger বিদ্যমান থাকার কারণ হ'ল পয়েন্টার-আকারের ভেরিয়েবলগুলি ধরে রাখার intপরিবর্তে অনেকগুলি লিগ্যাসি এপিআই ভুলভাবে ব্যবহৃত হয়েছিল long, যার অর্থ এই ছিল যে এপিআইগুলি তাদের 64৪-বিট সংস্করণে বদলে intযেতে longহয়েছিল। অন্য কথায়, আপনি 32-বিট বা 64-বিট আর্কিটেকচারের জন্য সংকলন করছেন কিনা তার উপর নির্ভর করে একটি এপিআই-র বিভিন্ন ফাংশন স্বাক্ষর থাকবে have NSIntegerএই লিগ্যাসি এপিআই দিয়ে এই সমস্যাটি মাস্ক করার ইচ্ছা করে।

আপনার নতুন কোডে, আপনার intযদি 32-বিট ভেরিয়েবলের long longপ্রয়োজন হয় , আপনার যদি 64-বিট পূর্ণসংখ্যার প্রয়োজন হয় এবং এবং longঅথবা NSIntegerআপনাকে পয়েন্টার আকারের ভেরিয়েবলের প্রয়োজন হয় তবে ব্যবহার করুন।


25
ইতিহাস স্পট হয়, কিন্তু পরামর্শ ভয়ঙ্কর। আপনার যদি 32-বিটের পরিবর্তনশীল ব্যবহারের প্রয়োজন হয় int32_t। আপনার যদি 64-বিট পূর্ণসংখ্যার ব্যবহারের প্রয়োজন হয় int64_t। আপনার যদি পয়েন্টার আকারের পরিবর্তনশীল ব্যবহারের প্রয়োজন হয় intptr_t
স্টিফেন ক্যানন

5
স্টিফেন, আপনার পরামর্শটি কখন ইনট, লম্বা বা এনএসআইন্টার ব্যবহার করবেন না?
ড্যারেন

7
না, আমার পরামর্শ হ'ল যদি আপনার কোনও নির্দিষ্ট ধরণের আকারের পরিচিত আকারের প্রয়োজন হয় তবে এগুলি কখনই ব্যবহার করবেন না। <stdint.h>ধরনের যে উদ্দেশ্যে বিদ্যমান।
স্টিফেন ক্যানন

3
স্টিফেন, আমার উত্তরটি "কখন এনএসআইন্টেজার বনাম ইন্ট ব্যবহার করবেন" এই প্রশ্নের জবাবে ছিল, "32-বিট সংখ্যার ক্রস-প্ল্যাটফর্ম টাইপনেম কী" না। যদি কেউ এনএসআইন্টার এবং ইন্টের মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করে থাকে তবে তারা বুঝতে পারে যে তারা যে প্ল্যাটফর্মগুলিতে সমর্থন করেন তারা কতটা বড়।
ড্যারেন

1
নোট যে LP64গ্যারান্টি দেয় না যে long long64 বিট। একটি LP64প্ল্যাটফর্মটি long long128 বিটের পূর্ণসংখ্যার হতে পারে।
স্টিফেন ক্যানন

26

যদি আপনি এনএসআইন্টেজারের প্রয়োগটি খনন করেন:

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

সহজভাবে, এনএসআইঞ্জার টাইপডিফ আপনার জন্য একটি পদক্ষেপ রাখে: যদি আর্কিটেকচারটি 32-বিট হয় intতবে এটি ব্যবহার করে , যদি এটি 64-বিট হয় তবে এটি ব্যবহার করে long। এনএসআইঞ্জার ব্যবহার করে, প্রোগ্রামটি যে আর্কিটেকচারটি চলছে তা নিয়ে আপনার চিন্তা করার দরকার নেই।


14
আপনার উদ্বেগের দরকার নেই কারণ এনএসআইন্টিজারের জন্য সঠিক ফর্ম্যাট সুনির্দিষ্ট আর্কিটেকচারের উপর নির্ভরশীল।
জেরেমিপ

অ্যাপল ম্যানুয়াল অনুসারে সবচেয়ে সহজ উপায় হ'ল বৃহত্তম সংখ্যার ধরণের মান castালাই long long। সুতরাং সমস্ত সংখ্যার ধরন একই ধরণের স্পেসিফায়ার ব্যবহার করবে।
ইনিল

6
এখন ফর্ম্যাট করার সহজতম উপায় হ'ল তাদের বক্সিং করা -NSLog("%@", @(1123));
এওনিল

1
আপনি এটি নিক্ষেপ করতেও পারেন:NSLog("%li", (long)theNSInteger);
ড্যানিয়েল

কাস্টিং আমাকে দু: খিত করে
tomalbrc

9

আপনার যদি NSNotFound বা NSIntegerMax এর মতো ধ্রুবক মানগুলির সাথে তুলনা করার প্রয়োজন হয় তবে আপনার NSInteger ব্যবহার করা উচিত, কারণ এই মানগুলি 32-বিট এবং 64-বিট সিস্টেমে পৃথক হবে, সুতরাং সূচীর মান, গণনা এবং এর মতো: NSInteger বা NSUInteger ব্যবহার করুন।

এটি বেশিরভাগ পরিস্থিতিতে NSInteger ব্যবহার করতে আঘাত দেয় না, এটি দ্বিগুণ স্মৃতি গ্রহণ না করে। মেমরির প্রভাব খুব কম, তবে আপনার যদি একসাথে প্রচুর সংখ্যা ভেসে থাকে তবে এটি ইনটগুলি ব্যবহার করতে পারে difference

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

মোট কথা, আপনি যদি একবারে তাদের কয়েক হাজার মেমরির প্রত্যাশা না করেন তবে দুজনের মধ্যে পার্থক্যের বিষয়ে ক্রমাগত উদ্বেগের চেয়ে NSInteger ব্যবহার করা আরও সহজ।


9

আপাতত (সেপ্টেম্বর ২০১৪) আমি NSInteger/CGFloatআইওএস এপিআই ইত্যাদির সাথে ইন্টারঅ্যাক্ট করার সময় ব্যবহার করার পরামর্শ দিচ্ছি যদি আপনিও আর্ম 64 এর জন্য আপনার অ্যাপ তৈরি করে থাকেন। এর কারণ হল আপনি সম্ভবত অপ্রত্যাশিত ফলাফল পেতে হবে যখন আপনি ব্যবহার করেন float, longএবং intধরনের।

উদাহরণ: ফ্লাট / ডাবল বনাম সিজিএফ্লোট

উদাহরণ হিসাবে আমরা UITableView প্রতিনিধি পদ্ধতি গ্রহণ করি tableView:heightForRowAtIndexPath:

কেবলমাত্র 32-বিট অ্যাপ্লিকেশনটিতে এটি লিখিত থাকলে এটি সূক্ষ্মভাবে কাজ করবে:

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44;
}

floatএকটি 32-বিট মান এবং 44 আপনি ফিরে আসছেন এটি 32-বিট মান। তবে, আমরা যদি 64-বিট আর্ম 64 আর্কিটেকচারে কোডটি এই একই টুকরোটি সংকলন / চালনা করি তবে 44 এর একটি 64-বিট মান হবে। একটি 32-বিট মান প্রত্যাশিত যখন একটি 64-বিট মান প্রত্যাবর্তন একটি অপ্রত্যাশিত সারি উচ্চতা দেয়।

আপনি CGFloatটাইপটি ব্যবহার করে এই সমস্যাটি সমাধান করতে পারেন

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44;
}

এই ধরণেরটি float32-বিট পরিবেশে একটি 32-বিট এবং doubleএকটি 64-বিট পরিবেশে একটি 64-বিট উপস্থাপন করে। সুতরাং এই ধরণের ব্যবহার করার সময় পদ্ধতিটি সর্বদা সংকলন / রানটাইম পরিবেশ নির্বিশেষে প্রত্যাশিত প্রকারটি গ্রহণ করবে।

পূর্ণসংখ্যা প্রত্যাশা পদ্ধতিগুলির ক্ষেত্রেও এটি একই। এই জাতীয় পদ্ধতিগুলি int32-বিট পরিবেশে 32-বিট মান এবং একটি 64-বিট পরিবেশে একটি 64-বিট মান আশা করবে long। সংকলন / রানটাইম এনভায়রোনমেন্টের উপর নির্ভর করে NSIntegerযা টাইপ করে intবা কোনও হিসাবে কাজ করে আপনি এই longকেসটি সমাধান করতে পারেন।


যদি আমি জানি যে এই নির্দিষ্ট ভেরিয়েবলের মানটিতে বৃহত সংখ্যক মান থাকতে পারে না এবং তাই আমি int ব্যবহার করতে চাই। এটি 64-বিট পরিবেশে উভয়ই সূক্ষ্মভাবে কাজ করবে। আমার মনে হয় এটা খুব উচিত, আমি একটি ভালো লুপ জন্য দেখা যায় না: এর জন্য (int i = 0; আমি <10; আমি ++,) কোন ভুল আচরণ পরিবেশ নির্বিশেষে এটা চালানো হয় করছেন।
চঞ্চল রাজ

@ চঞ্চল রাজ যতক্ষণ না অন্য ধরণের কোনও ingালাই বা রূপান্তর না হয় বা তৃতীয় পক্ষের শ্রেণি এবং সেই পরিবর্তনশীল সম্পর্কিত পদ্ধতিগুলির ব্যবহার / ওভাররাইডিং না হয়, এনএসআইন্টের পরিবর্তে কোন ইন্ট ব্যবহার করা ভাল হবে।
লিওন লুকার্ডি

9

আইওএস-এ, আপনি ব্যবহার করেন intবা ব্যবহার করেন তা বর্তমানে কিছু যায় আসে না NSInteger। আইওএস 64-বিটগুলিতে স্থানান্তরিত হলে / এর থেকে আরও বেশি কিছু যায় আসে।

সহজ কথায়, NSIntegerগুলি int32-বিট কোডে এস হয় (এবং এইভাবে 32-বিট দীর্ঘ) এবং long64৪-বিট কোডে ( long64৪-বিট কোডে 64৪-বিট প্রশস্ত, তবে 32-বিট কোডে 32-বিট) s NSIntegerপরিবর্তে ব্যবহারের সর্বাধিক সম্ভাব্য কারণ longহ'ল বিদ্যমান 32-বিট কোডটি (যা ব্যবহার করে int) না ভাঙা ।

CGFloatএকই সমস্যা রয়েছে: 32-বিটে (কমপক্ষে ওএস এক্সে), এটি float; -৪-বিট এ, এটি double

আপডেট: আইফোন 5 এস, আইপ্যাড এয়ার, রেটিনা সহ আইপ্যাড মিনি এবং আইওএস 7 প্রবর্তনের সাথে সাথে আপনি এখন আইওএস-তে 64-বিট কোড তৈরি করতে পারবেন।

আপডেট 2: এছাড়াও, NSIntegerএস ব্যবহার করে সুইফট কোড আন্তঃআকোণশীলতার সাথে সহায়তা করে।


0

int = 4 বাইট (স্থপতি নির্বিশেষে আকার নির্ধারিত) NSInteger = স্থপতিটির আকারের উপর নির্ভর করে (উদাহরণস্বরূপ 4 বাইট আর্কিটেক্ট = 4 বাইট এনএসআইন্টার আকারের জন্য)

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