এনএসএসস্ট্রিং তুলনা বোঝা


84

নিম্নলিখিত দুটি তুলনা সত্যকে মূল্যায়ন করে:

1)

@"foo" == @"foo";

2)

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;

তবে, নিশ্চয়ই এমন সময় রয়েছে যেখানে NSStringসমতা অপারেটরটি ব্যবহার করে দু'জনের তুলনা করা যায় না এবং এর [myString1 isEqualToString:myString2]পরিবর্তে প্রয়োজনীয় হয়। কেউ কি এ সম্পর্কে কিছু আলোকপাত করতে পারে?

উত্তর:


166

==পয়েন্টার তুলনা করার কারণে কাজ করার কারণ। আপনি যখন কোনও ধ্রুবক NSStringব্যবহারের সংজ্ঞা দেন @"", সংকলকটি রেফারেন্সটিকে আলাদা করে দেয়। যখন আপনার কোডে অন্য স্থানে একই ধ্রুবকগুলি সংজ্ঞায়িত করা হয়, তখন তারা সকলেই মেমরির একই প্রকৃত অবস্থানের দিকে নির্দেশ করবে।

NSStringউদাহরণগুলির সাথে তুলনা করার সময় , আপনাকে এই isEqualToString:পদ্ধতিটি ব্যবহার করা উচিত :

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3))  //0
NSLog(@"%d", (myString1 == myString2)); //1
NSLog(@"%d", [myString1 isEqualToString:myString2]); //1
NSLog(@"%d", [myString1 isEqualToString:myString3]); //1
[myString3 release];

সম্পাদনা করুন:

NSString *myString3 = [[NSString alloc] initWithString:@"foo"]; 
// this is same with @"foo"

initWithString:আর কোনও নতুন রেফারেন্স তৈরি করে না, আপনার প্রয়োজন হবে initWithFormat,

NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];

6
বেশিরভাগ সংকলক এছাড়াও একটি অপ্টিমাইজেশন হিসাবে myString3ধ্রুবক একটি পয়েন্টার তৈরি করবে "foo", তাই সাধারণত, এই তিনটি পরিবর্তনশীল একই মেমরি অবস্থান নির্দেশ করবে। এটি জিসিসি এবং ঝনঝন উভয়ের জন্যই সত্য (ডিফল্ট বিকল্প সহ)। এটি সংকলনের চেষ্টা করুন: gist.github.com/578568
mipadi

এবং তাই আমি কীভাবে একটি এনএসএসআরটিং ভেরিয়েবলকে ঠিক "" ... "এর মতো আচরণ করতে পারি? আমি জিজ্ঞাসার কারণটি এখনই আমার কোডে বি / সি, ধ্রুবক @ ".." কাজ করে তবে এটি
এনএসএসস্ট্রিং

4
+1 টি, শুধু যোগ করার জন্য: isEqual:আসলে নেই একটি পূর্ণ স্ট্রিং তুলনা এবং আয় হিসাবে একই ফলাফলের না isEqualToStringকারণ NSObject প্রোটোকল রেফারেন্স এবং NSString ক্লাস রেফারেন্স স্পষ্টভাবে উল্লেখ (যথাক্রমে): "দুটি বস্তুর সমান থাকলে (দ্বারা -isEqual:) তারা একই থাকতে হবে হ্যাশ মান "এবং" যদি দুটি স্ট্রিং অবজেক্ট সমান হয় (আইকুয়ালটোস্ট্রিং: পদ্ধতি দ্বারা নির্ধারিত হয়) তবে তাদের অবশ্যই হ্যাশ মান থাকতে হবে। "
এফেমেরা

13

সাম্যতা অপারেটর ==কেবল পয়েন্টার ঠিকানাগুলির সাথে তুলনা করে। আপনি যখন আক্ষরিক @""সিনট্যাক্স ব্যবহার করে দুটি অভিন্ন স্ট্রিং তৈরি করেন , সংকলক সনাক্ত করবে যে তারা সমান, এবং কেবলমাত্র একবার ডেটা সংরক্ষণ করে। সুতরাং, দুটি পয়েন্টার একই অবস্থান নির্দেশ করে। তবে অন্যান্য উপায়ে তৈরি স্ট্রিংগুলিতে অভিন্ন তথ্য থাকতে পারে, তবুও বিভিন্ন মেমরির স্থানে সংরক্ষণ করা যেতে পারে। সুতরাং, স্ট্রিংগুলির তুলনা করার সময় আপনার সর্বদা ব্যবহার করা উচিত isEqual:

নোট করুন isEqual:এবং isEqualToString:সর্বদা একই মানটি ফেরত দিন তবে isEqualToString:এটি দ্রুত।


4
এছাড়াও মনে রাখবেন isEqualToString: প্যারামিটারটি যদি পাস করা হয় তবে এটি ব্যতিক্রম ঘটায় nil। সুতরাং যদি কোনও সুযোগের সাথে আপনি শূণ্য স্ট্রিংয়ের সাথে তুলনা করছেন, আপনার প্রথমে শূন্য চেক করা উচিত বা ব্যবহার করা উচিতisEqual:
স্যান্ডি চ্যাপম্যান

10

==মেমরিতে অবস্থানের তুলনা করে। ptr == ptr2যদি তারা উভয় একই মেমরি অবস্থানের দিকে নির্দেশ করে। স্ট্রিং ধ্রুবকগুলির সাথে এটি কাজ করার কারণ সংকলকটি অভিন্ন স্ট্রিং ধ্রুবকগুলির জন্য একটি প্রকৃত স্ট্রিং ব্যবহার করতে দেখা যায় । আপনার যদি একই বিষয়বস্তুগুলির সাথে ভেরিয়েবল থাকে তবে এটি কাজ করবে না , কারণ তারা বিভিন্ন মেমরির অবস্থানগুলিতে নির্দেশ করবে; isEqualToStringযেমন একটি ক্ষেত্রে ব্যবহার করুন ।


"আপনি যদি একই বিষয়বস্তুগুলির সাথে ভেরিয়েবলগুলি
রাখেন

6

কোকোতে স্ট্রিংগুলি এনএসএসস্ট্রিংয়ের isEqualToString:পদ্ধতি ব্যবহার করে তুলনা করা হয় ।

পয়েন্টারের তুলনাটি আপনার ক্ষেত্রে কাজ করে কারণ সংকলক দুটি স্ট্রিং লিটারেলগুলিকে এক বস্তুর দিকে নির্দেশ করতে যথেষ্ট মৃদু। দুটি অভিন্ন স্ট্রিং একটি NSStringউদাহরণ ভাগ করে নেওয়ার কোনও গ্যারান্টি নেই ।


আপনার এই সম্পর্কে কোন অফিসিয়াল রেফারেন্স আছে? "দু'টি অভিন্ন স্ট্রিং একটি এনএসএস স্ট্রিংয়ের উদাহরণ ভাগ করে নেওয়ার কোনও গ্যারান্টি নেই।"
লজিকসরাস রেক্স

@ ইউজার 3055655 আমার কোনও রেফারেন্সের দরকার নেই: আপনি সহজেই কোড লিখতে পারেন যা NSStringঅভিন্ন সামগ্রী সহ দুটি স্বতন্ত্র ঘটনা তৈরি করে :[NSMutableString string] != [NSMutableString string]
নিকোলাই রুহে

@ ইউজার 3055655 আপনি যদি বোঝাতে চান যে আমার দাবিটি স্ট্রিং লিটারালগুলির পক্ষে সত্য নয়: দুটি বান্ডিল থেকে লিটারেল চেষ্টা করুন (অ্যাপ এবং এর পরীক্ষাগুলির মতো)।
নিকোলাই রুহে

আমি সহকর্মীদের দেখানোর জন্য কিছু চাইছিলাম। আমি মিউটেবল স্ট্রিংগুলি সমান হওয়ার আশা করব না, তবে এনএসএসটিংয়ের দুটি উদাহরণ ঘোষণা করে কিছু @ "স্ট্রিংয়ের মান" নির্ধারণ করা কার্যত ==কার্যকারিতার গ্যারান্টি দেয়। তবে, আপনি যদি একটি এনএসএসটিংকে সুদৃ .় করেন, একটি মান নির্ধারণ করুন এবং তার পরে অন্য এনএসএস স্ট্রিংটি ভালভাবে সাজান NSString stringWithFormat:তবে বাস্তবে আপনি দুটি ভিন্ন স্ট্রিং পাবেন যা ==ব্যর্থ হবে। আপনি বলেছিলেন যে দুটি এনএসএসআরটিং (এনএসমুটেবল স্ট্রিং নয়) একটি এনএসটিস্ট্রিং উদাহরণ উপস্থাপন করবে এমন কোনও গ্যারান্টি নেই এবং আমি কেবল জিজ্ঞাসা করেছি যে আপনার কাছে সেই দাবির কোনও প্রমাণ রয়েছে যাতে আমি এটি ভাগ করে নিতে পারি।
লজিকসৌরাস রেক্স

@ user3055655 যেমনটি আমি বলেছি, স্বতন্ত্র বান্ডিলগুলি থেকে আক্ষরিক চেষ্টা করুন।
নিকোলাই রুহে

3

স্ট্রিং তুলনার জন্য সার্গেট হিসাবে ঠিকানার তুলনাটি কীভাবে ভাঙবে তা উদাহরণস্বরূপ:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *s1 = @"foo";
    NSString *s2 = @"foo";
    NSString *s3 = [[[NSString alloc] initWithString:@"foo"] autorelease];
    NSMutableString *s4 = [NSMutableString stringWithString:@"foobar"];
    [s4 replaceOccurrencesOfString:@"bar"
                        withString:@""
                           options:NSLiteralSearch
                             range:NSMakeRange(0, [s4 length])];

    NSLog(@"s1 = %p\n", s1);
    NSLog(@"s2 = %p\n", s2);
    NSLog(@"s3 = %p\n", s3);
    NSLog(@"s4 = %p\n", s4); // distinct from s1

    NSLog(@"%i", [s1 isEqualToString:s4]); // 1

    [pool release];

0

এই উদাহরণটি দেখুন:

NSString *myString1 = @"foo";
NSMutableString *myString2 = [[NSMutableString stringWithString:@"fo"] stringByAppendingString: @"o"];

NSLog(@"isEquality: %@", ([myString1 isEqual:myString2]?@"+":@"-")); //YES
NSLog(@"isEqualToStringity: %@", ([myString1 isEqualToString:myString2]?@"+":@"-")); //YES
NSLog(@"==ity: %@", ((myString1 == myString2)?@"+":@"-")); // NO

সুতরাং, সংকলকটি এনএসএসটিরিং এবং ডেরেফারেন্স পয়েন্টারগুলির জন্য আইসকুয়ালগুলি প্রক্রিয়া করতে আইজুয়াল টুস্ট্রিং পদ্ধতিটি ব্যবহার করতে পারে, যদিও এটি ছিল না। এবং পয়েন্টারগুলি আলাদা, যেমন আপনি দেখেন।


-1
  NSString *str1=[NSString stringWithFormat:@"hello1"];
    NSString *str2=[NSString stringWithFormat:@"hello1"];
    NSString *str3 = [[NSString alloc] initWithString:@"hello1"];




// == compares the pointer but in our example we are taking same string value to different object  using @  so it will point to same address so output will be TRUE condition
    if (str1==str2) {
        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");
    }


    // == compares the pointer but in our example we are taking same string value to different object but we have allocated different string so both object will pount to different address so output will be FALSE condition
    if (str1==str3) {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

    }


  // compare:= compares the values of objects so output will be TRUE condition
    if ([str1 compare:str3]== NSOrderedSame) {
        NSLog(@"Both String are equal");

    }
    else{
        NSLog(@"Both String not are equal");

    }


    // isEqual compares the values of objects so output will be TRUE condition

    if ([str1 isEqual:str2]) {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

    }

    // isEqual compares the values of objects so output will be TRUE condition

    if ([str1 isEqual:str3]) {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

    }


    // isEqualToString compares the values of objects so output will be TRUE condition
    if ([str1 isEqualToString:str2]) {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

    }


    // isEqualToString compares the values of objects so output will be TRUE condition
    if ([str1 isEqualToString:str3]) {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

    }

    // == compares the pointers since we have initialized the same value to first object so the pointer be be same for same value so output will be TRUE condition
    if (str1==@"hello1") {

        NSLog(@"Both String are equal");
    }
    else{
        NSLog(@"Both String not are equal");

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