Benim araştırmam bu. Ne zaman #import, ne zaman @class kullanılır?
Basit cevap: Siz #import
veya #include
fiziksel bir bağımlılık olduğunda. Aksi takdirde, (ileri bildirimleri kullanmak @class MONClass
, struct MONStruct
,@protocol MONProtocol
).
İşte fiziksel bağımlılığın bazı yaygın örnekleri:
- Herhangi bir C veya C ++ değeri (bir işaretçi veya başvuru fiziksel bir bağımlılık değildir). Bir
CGPoint
ivar veya mülkünüz varsa, derleyicinin bildirimini görmesi gerekir.CGPoint
.
- Üst sınıfınız.
- Kullandığınız bir yöntem.
Bazen bir @class bildirimi kullanırsam, aşağıdaki gibi ortak bir derleyici uyarısı görürüm: "uyarı: alıcı 'FooController' ileri bir sınıftır ve karşılık gelen @ arabirimi olmayabilir."
Derleyici aslında bu konuda çok yumuşak. İpuçlarını bırakacaktır (yukarıdaki gibi), ancak onları yoksayar ve #import
düzgün bir şekilde yapmazsanız yığınınızı kolayca çöpe atabilirsiniz . Olmasına rağmen (IMO), derleyici bunu zorlamıyor. ARC'de, derleyici daha katıdır çünkü referans sayımından sorumludur. Ne oluyor derleyici, çağırdığınız bilinmeyen bir yöntemle karşılaştığında varsayılana geri dönüyor. Her dönüş değeri ve parametresinin olduğu varsayılır id
. Bu nedenle, kod tabanlarınızdaki her uyarıyı ortadan kaldırmalısınız, çünkü bu fiziksel bağımlılık olarak düşünülmelidir. Bu, bildirilmeyen bir C işlevini çağırmaya benzer. C ile parametrelerinint
.
İleri bildirimleri tercih etmenizin nedeni, derleme sürelerinizi faktörlere göre azaltabilmenizdir, çünkü minimum bağımlılık vardır. İleri bildirimlerde derleyici bir ad olduğunu görür ve fiziksel bir bağımlılık olmadığında sınıf bildirimini veya tüm bağımlılıklarını görmeden programı doğru şekilde ayrıştırıp derleyebilir. Temiz yapılar daha az zaman alır. Artımlı yapılar daha az zaman alır. Elbette, sonuç olarak ihtiyacınız olan tüm başlıkların her çeviri tarafından görülebildiğinden emin olmak için biraz daha fazla zaman harcayacaksınız, ancak bu, azaltılmış derleme sürelerinde hızlı bir şekilde işe yarıyor (projenizin küçük olmadığı varsayılarak).
Kullanırsanız #import
veya #include
bunun yerine, derleyiciye gereğinden çok daha fazla iş atıyorsunuz. Ayrıca karmaşık başlık bağımlılıkları da sunuyorsunuz. Bunu kaba kuvvet algoritmasına benzetebilirsiniz. Siz #import
, kaynakları ayrıştırmak ve derlemek için çok fazla bellek, disk G / Ç ve CPU gerektiren tonlarca gereksiz bilgiyi sürüklersiniz.
ObjC, bağımlılık açısından C tabanlı bir dil için ideale oldukça yakındır, çünkü NSObject
türler asla değer değildir - NSObject
türler her zaman referans sayılan işaretçilerdir. Böylece, programınızın bağımlılıklarını uygun şekilde yapılandırırsanız ve mümkün olan her yerde ileri doğru yaparsanız inanılmaz derecede derleme sürelerinden kurtulabilirsiniz, çünkü çok az fiziksel bağımlılık gerekir. Bağımlılığı daha da azaltmak için sınıf uzantılarındaki özellikleri de bildirebilirsiniz. Bu, büyük sistemler için büyük bir bonus - büyük bir C ++ kod tabanı geliştirdiyseniz, bunun farkını bilirsiniz.
Bu nedenle, tavsiyem mümkün olduğunda ileriye ve sonra #import
fiziksel bağımlılığın olduğu yere kullanmaktır . Uyarıyı veya fiziksel bağımlılığı ima eden başka bir uyarı görürseniz hepsini düzeltin. Düzeltme, #import
uygulama dosyanızda yapılacaktır.
Kütüphaneler oluştururken, bazı arayüzleri bir grup olarak sınıflandırırsınız, bu durumda #import
fiziksel bağımlılığın getirildiği kütüphaneyi (örn. #import <AppKit/AppKit.h>
) Yaparsınız . Bu bağımlılık getirebilir, ancak kütüphane koruyucular genellikle sizin için fiziksel bağımlılıkları gerektiği gibi halledebilir - bir özellik sunarlarsa, yapılarınız üzerindeki etkisini en aza indirebilirler.