উত্তর:
objectForKey:
একটি NSDictionary
পদ্ধতি। একটি NSDictionary
হ'ল অনুরূপ একটি সংগ্রহ শ্রেণি NSArray
, সূচিগুলি ব্যবহার না করে আইটেমগুলির মধ্যে পার্থক্য করার জন্য এটি কী ব্যবহার করে। কীটি আপনার সরবরাহ করা একটি স্বেচ্ছাসেবী স্ট্রিং। কোনও দুটি বস্তুর একই কী থাকতে পারে না (যেমন কোনও দুটি বস্তুর NSArray
একই সূচক থাকতে পারে না)।
valueForKey:
একটি কেভিসি পদ্ধতি। এটি যে কোনও ক্লাসের সাথে কাজ করে। valueForKey:
আপনাকে তার নামের জন্য স্ট্রিং ব্যবহার করে কোনও সম্পত্তি অ্যাক্সেস করার অনুমতি দেয়। সুতরাং উদাহরণস্বরূপ, আমার Account
কোনও সম্পত্তি সহ একটি ক্লাস থাকলে আমি accountNumber
নিম্নলিখিতটি করতে পারি:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
কেভিসি ব্যবহার করে, আমি গতিসম্পন্নভাবে সম্পত্তিটি অ্যাক্সেস করতে পারি:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
সেগুলি বিবৃতিগুলির সমতুল্য সেট।
আমি জানি আপনি চিন্তা করছেন: বাহ, কিন্তু ব্যঙ্গাত্মকভাবে। কেভিসি সমস্ত দরকারী মনে হয় না। আসলে, এটি "শব্দযুক্ত" দেখায়। তবে আপনি যখন রানটাইমের সময় জিনিসগুলি পরিবর্তন করতে চান, আপনি প্রচুর শীতল জিনিসগুলি করতে পারেন যা অন্যান্য ভাষাগুলিতে আরও বেশি কঠিন (তবে এটি আপনার প্রশ্নের ক্ষেত্রের বাইরে)।
আপনি যদি কেভিসির বিষয়ে আরও জানতে চান তবে বিশেষত স্কট স্টিভেনসনের ব্লগে গুগল করা থাকলে অনেক টিউটোরিয়াল রয়েছে । আপনি NSKeyValueCoding প্রোটোকল রেফারেন্সও পরীক্ষা করে দেখতে পারেন ।
আশা করি এইটি কাজ করবে.
যখন তুমি কর valueForKey:
এটি দরকার এটি একটি objectForKey:
এনএসএসস্ট্রিং দেওয়ার দরকার হয়, যেখানে কোনও এনএসবজেক্ট সাবক্লাসটি কী হিসাবে নিতে পারে। এটি কারণ কী-মান কোডিংয়ের জন্য, কীগুলি সর্বদা স্ট্রিং থাকে।
প্রকৃতপক্ষে, ডকুমেন্টেশনে বলা হয়েছে যে আপনি যখন valueForKey:
এনএসএসটিং প্রদান করেন তখনও এটি objectForKey:
স্ট্রিংটি শুরু না করা সত্ত্বেও তা ডাকবে @
, যার ক্ষেত্রে এটি আহ্বান জানায় [super valueForKey:]
, যা valueForUndefinedKey:
ব্যতিক্রম বাড়াতে পারে call
objectForKey:
পরিবর্তে যেখানেই সম্ভব সেখানে ব্যবহারের এক দুর্দান্ত কারণ valueForKey:
- valueForKey:
একটি অজানা কীটি NSUnknownKeyException
"এই শ্রেণীর কীটির জন্য কী মান কোডিং-সম্মতিযুক্ত নয়" বলে নিক্ষেপ করবে ।
যেমনটি বলা হয়েছে, objectForKey:
ডেটাটাইপটি :(id)aKey
যেখানে valueForKey:
ডেটাটাইপ হয় :(NSString *)key
।
উদাহরণ স্বরূপ:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
সুতরাং, valueForKey:
কেবল একটি স্ট্রিং মান নেবে এবং এটি কেভিসি পদ্ধতি, যেখানে objectForKey:
কোনও ধরণের অবজেক্ট গ্রহণ করবে।
মানটি objectForKey
একই ধরণের বস্তু দ্বারা অ্যাক্সেস করা হবে।
আমি এখানে একটি বিস্তৃত উত্তর দেওয়ার চেষ্টা করব। বেশিরভাগ পয়েন্ট অন্যান্য উত্তরে উপস্থিত হয় তবে আমি প্রতিটি উত্তর অসম্পূর্ণ এবং কিছুটি ভুল পেয়েছি।
প্রথম এবং সর্বাগ্রে, objectForKey:
একটি NSDictionary
পদ্ধতি, যখনvalueForKey:
কোনও কেভিসি অভিযোগ শ্রেণীর জন্য প্রয়োজনীয় কেভিসি প্রোটোকল পদ্ধতি - এনএসডিকোরিয়াসহ।
তদ্ব্যতীত, @dreamlax যেমন লিখেছিলেন, ডকুমেন্টেশন নির্দেশ যে NSDictionary
তার প্রয়োগ valueForKey:
পদ্ধতি ব্যবহার তার objectForKey:
বাস্তবায়ন। অন্য কথায় - [NSDictionary valueForKey:]
কল[NSDictionary objectForKey:]
।
এর থেকে বোঝা যায় যে এর valueForKey:
চেয়ে দ্রুত আর কখনও হতে পারে নাobjectForKey:
(একই ইনপুট কীতে) এর যদিও পুরো পরীক্ষায় আমি প্রায় 5% থেকে 15% পার্থক্য করেছি, বিলিয়ন বিলিয়ন এলোমেলো অ্যাক্সেসকে বিশাল এনএসডিকোরিয়ামে পেয়েছি। সাধারণ পরিস্থিতিতে - পার্থক্য নগণ্য।
পরবর্তী: কেভিসি প্রোটোকল কেবল NSString *
কীগুলির সাথে কাজ করে , সুতরাং valueForKey:
কেবল NSString *
(বা সাবক্লাস) কী হিসাবে গ্রহণ করবে , NSDictionary
অন্য ধরণের বস্তুর সাথে কী হিসাবে কাজ করতে পারে - যাতে "নিম্ন স্তরের" objectForKey:
কোনও অনুলিপি-সক্ষম (এনএসকোপিং প্রোটোকল অনুবর্তী) অবজেক্ট গ্রহণ করে চাবি হিসাবে
সর্বশেষ, NSDictionary's
বাস্তবায়ন valueForKey:
মান আচরণ KVC এর ডকুমেন্টেশন সংজ্ঞায়িত থেকে বিচ্যুত, এবং একটি নির্গত করা হবে না NSUnknownKeyException
একটি কী খুঁজে পাচ্ছি না জন্য - যদি না এই একটি "বিশেষ" চাবিকাঠি - এক যে দিয়ে শুরু হয় '@' - যা সাধারণত এর অর্থ একটি " সমষ্টি "ফাংশন কী (যেমন @"@sum, @"@avg"
)। পরিবর্তে, এনএসডেটরিয়ায় একটি কী কী পাওয়া যায় না - এটি একইভাবে শূন্য করেobjectForKey:
আমার নোটগুলি প্রদর্শনের জন্য এবং প্রমাণ করার জন্য নিম্নলিখিত কিছু পরীক্ষার কোড রয়েছে।
- (void) dictionaryAccess {
NSLog(@"Value for Z:%@", [@{@"X":@(10), @"Y":@(20)} valueForKey:@"Z"]); // prints "Value for Z:(null)"
uint32_t testItemsCount = 1000000;
// create huge dictionary of numbers
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:testItemsCount];
for (long i=0; i<testItemsCount; ++i) {
// make new random key value pair:
NSString *key = [NSString stringWithFormat:@"K_%u",arc4random_uniform(testItemsCount)];
NSNumber *value = @(arc4random_uniform(testItemsCount));
[d setObject:value forKey:key];
}
// create huge set of random keys for testing.
NSMutableArray *keys = [NSMutableArray arrayWithCapacity:testItemsCount];
for (long i=0; i<testItemsCount; ++i) {
NSString *key = [NSString stringWithFormat:@"K_%u",arc4random_uniform(testItemsCount)];
[keys addObject:key];
}
NSDictionary *dict = [d copy];
NSTimeInterval vtotal = 0.0, ototal = 0.0;
NSDate *start;
NSTimeInterval elapsed;
for (int i = 0; i<10; i++) {
start = [NSDate date];
for (NSString *key in keys) {
id value = [dict valueForKey:key];
}
elapsed = [[NSDate date] timeIntervalSinceDate:start];
vtotal+=elapsed;
NSLog (@"reading %lu values off dictionary via valueForKey took: %10.4f seconds", keys.count, elapsed);
start = [NSDate date];
for (NSString *key in keys) {
id obj = [dict objectForKey:key];
}
elapsed = [[NSDate date] timeIntervalSinceDate:start];
ototal+=elapsed;
NSLog (@"reading %lu objects off dictionary via objectForKey took: %10.4f seconds", keys.count, elapsed);
}
NSString *slower = (vtotal > ototal) ? @"valueForKey" : @"objectForKey";
NSString *faster = (vtotal > ototal) ? @"objectForKey" : @"valueForKey";
NSLog (@"%@ takes %3.1f percent longer then %@", slower, 100.0 * ABS(vtotal-ototal) / MAX(ototal,vtotal), faster);
}