SORU
7 EKİM 2008, Salı


Objective-C ad çarpışma bir çözmek için en iyi yolu nedir?

Objective-C ad; C, her şey tek bir global isim alanı içinde olduğu gibi. Yaygın bir uygulama olduğu için önek sınıflarla baş harfleri, örneğin çalışıyorsanız IBM, olabilir önek onlarla "IBM"; eğer çalışmak için Microsoft, geçer "MS"; ve benzeri. Bazen harfleri projeye bakın, örneğin Audium önekleri sınıfları ile "baş harflerini alabilirsin arkasında firma yok gibi. Apple NS ile sınıfları önekler ve bu önek Apple sadece ayrılmıştır diyor.

Şimdiye kadar iyi. Ama karşısına bir sınıf adı için 4 harf 2 eklenmesinden çok, çok sınırlı bir ad. E. g. MS ya da AI tamamen farklı anlamlara sahip olabilir (AI örneğin Yapay Zeka olabilir) ve diğer bazı geliştirici ve eşit adında bir sınıf oluşturmak için karar verebilirsiniz.Bangçarpışma ad.

Eğer bu kendi sınıfında ve kullandığınız bir dış çerçeve arasında bir çarpışma varsa Tamam, kolayca sınıf büyütülecek bir adlandırma değiştirebilirsiniz.Ama ne olursa iki dış çerçeveler kullanırsanız, kaynak yok ve sen bunu değiştiremezsin hem çerçeveler?Uygulamanız ikisi ile de bağlantıları ve Adı çakışıyor. Nasıl bu çözme hakkında gitmek istiyorsunuz? Yine de her iki sınıf da kullanabilirsiniz böyle bir şekilde onları geçici bir çözüm bulmak için en iyi yolu nedir?

C olabilir çözüm bu değil bağlama doğrudan kütüphaneye, bunun yerine yük kütüphanede çalışma zamanı kullanarak dlopen(), sonra bulmak sembolü arıyorsanız kullanarak dlsym() ve atamak için bir küresel sembol (size isminiz gibi) ve daha sonra erişim yoluyla bu küresel sembolü. E. g. eğer bir çakışma nedeniyle bazı C kütüphanesi " adında bir işlev open () diye tanımladığınız bir değişken adında myOpen ve bu noktaya open() işlevi, kütüphane, böylece zaman kullanmak istediğiniz sistem açık(), hayır önce open() ve ne zaman kullanmak istediğiniz diğeri, erişim yoluyla myOpen tanımlayıcı.

Bir şey mümkün Objective-C ve değilse, başka zeki, kurnaz çözüm çözmek kullanabilirsiniz ad çatışmalarda benzer? Herhangi bir fikir?

< / ^ hr .

Güncelleme:

Sadece netleştirmek için: bu önceden ad çakışmaları önlemek için nasıl ya da daha iyi bir ad oluşturmak için nasıl önermek cevaplar kesinlikle kabul edilir; ancak, onları olduğu gibi kabul etmemcevapsorunumu çözmek uğramaz. İki kütüphaneleri ve sınıf isimlerini çarpışır. Onları değiştiremem; ya da bir kaynağı yok. Çarpışma zaten var olan ve önceden kaçabilecek ipuçları yardım etmeyecekmiş. Ben bunları iletmek için geliştiriciler bu çerçeveler ve umut tercih daha iyi bir ad gelecek, ama şimdilik ben arama bir çözüm ile çalışmak çerçeveler şu an içinde tek bir uygulama. Bunu mümkün kılmak için herhangi bir çözüm?

CEVAP
7 EKİM 2008, Salı


Benzersiz bir önek ile sınıfların başına temelde tek seçenektir ama bu daha az zahmetli ve çirkin yapmak için çeşitli yollar vardır. Seçenekleri here uzun bir tartışma var. Benim favorim @compatibility_alias Objective-C derleyici Direktifi (12 ** tarif). @compatibility_alias "" bir sınıf, sınıf FQDN ya da onun gibi bir önek kullanarak adlandırmak için: . yeniden kullanabilirsiniz

@interface COM_WHATEVER_ClassName : NSObject
@end

@compatibility_alias ClassName COM_WHATEVER_ClassName
// now ClassName is an alias for COM_WHATEVER_ClassName

@implementation ClassName //OK
//blah
@end

ClassName *myClass; //OK

Bir parçası olarak tam bir strateji olabilir önek tüm sınıfları ile benzersiz bir önek gibi FQDN ve sonra oluştur başlığı ile @compatibility_alias (ben hayal edebileceğiniz otomatik oluşturmak " dedi header).

Böyle isime dezavantajı gerçek bir sınıf adı (*örneğin 5* yukarıda) derleyici ayrıca, bir dize için bir sınıf adı, gereken her şeyi girmek zorunda olması. Özellikle, @compatibility_alias derleyici Direktifi, NSClassFromString(ClassName) çok değil, çalışma zamanı fonksiyonu NSClassFromString(COM_WHATERVER_ClassName)kullanmak zorunda olacak (nil dönüş)--başarısız olur. Faz Interface Builder bir uç sınıf isimleri değiştir/tam COM_WHATEVER_... Interface Builder yazmak zorunda değilsin o kadar xib için Oluştur) ibtool kullanabilirsiniz.

Bu derleyici olarak kabul edilir, yani belirsiz bir kişi), Compiler arasında taşınabilir olmayabilir. çünkü son uyarı: Özellikle, eğer LLVM-GCC (GCC LLVM önyüz kullanarak) ile çalışması gerekir ama LLVM projeden Çınlama önyüz ile çalışıyor, bilmiyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CHISTOSITOJAJA

    CHISTOSITOJA

    27 HAZİRAN 2010
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • Videogamerz | Call of Duty

    Videogamerz

    5 NİSAN 2012