SORU
27 NİSAN 2011, ÇARŞAMBA


Kontrol örneği NSArray içeriyorsa NSString

Dizeleri bir grup ile bir dizi var ve eğer belirli bir dize dizisi içinde yer alan olup olmadığını kontrol etmek istiyorum. containsObject kullanırsam: dizi mesaj, doğru sonuçlar alıyorum. Aynı dize aynı nesneye işaret NSString tüm nesneler? Ya da neden containsObject: çalışıyor mu?

NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
  //DO SOMETHING
}

CEVAP
27 NİSAN 2011, ÇARŞAMBA


Evet, kodlu sabit NSStrings (dize hazır) (@"..." kaynak kod) işlemi çalışırken, sonsuza kadar var olan dizeleri dönüştü.

AncakNSArray'containsObject: s yöntemleri nesneleri isEqual:, dolayısıyla çağırırhatta bir dinamik olarak oluşturulan dize[NSString stringWithFormat:@"%d", 2] gibiYES dönecektiörnek bir göz atın.
Bu isEqual: (daha doğrusu isEqualToString:) yöntem NSString için uygulanan olmasıdırfarkında (karşılaştırma işaretçi kimlikler vs) içeriğive böylece döner dizeleri yaratıldıkları nasıl olursa olsun karakter aynı sıra (karşılaştırma) içeren herhangi bir çift için YES.

Eşit (işaretçi)kimlik kontrol dizi sıralamak lazım ve ile karşılaştırın

NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
    if (someString == yourString) {
        identicalStringFound = YES;
        break;
    }
}

büyük olasılıkla, yine de istemem.

Ya da daha uygun bir moda

BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;

(büyük olasılıkla bu da) olmaz.


Özetle:

Olumlu bir cevap alma nedeni containsObject:DEĞİLharflerden oluşan dizeler aynı sabit örneği paylaşır çünküAMAkongre tarafından containsObject: çünkü aramalar içerik farkında olan isEqual:,.

NSObject protocol isEqual: (kısa) belgeleri okumak isteyebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • mipd1980

    mipd1980

    25 EKİM 2006
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008