2009-07-13 6 views
5

Bir iPhone uygulaması geliştiriyorum ve Objective-C'ye ve ayrıca class.h ve class.m yapısına yeni bir yenilik yapıyorum.Objective-C'de iki sınıf arasında nasıl referanslar alabilirim?

Şimdi, hem diğer kişinin türünde bir değişken olması gerekir iki sınıfları var. Ama bu imkansız görünüyor.

class1.m (veya class2.m) sınıfında class1.h ve sonra class2.h içeriyorsa, class1.h sınıf2 değişkenlerini sınıf2.h ve sınıf1.h eklerseniz sınıf2 değişkenlerini bildiremiyorum Class1.h sınıfında class1 değişkenlerini bildiremiyorum.

Umarım benim fikrim var, çünkü bu beni deli ediyor. Bunu başarmak gerçekten imkansız mı?

Teşekkürler.

+4

Aradığın şey şu olabilir: http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

cevap

20

Sen başlık dosyasında bir sınıf ileriye bildirmek için @class anahtar sözcüğünü kullanabilirsiniz. Bu, başlık dosyalarını #import başlık dosyasına sahip olmadan tanımlamak için sınıf adını kullanmanızı sağlar.

Class1.h

@class Class2; 

@interface Class1 
{ 
    Class2 * class2_instance; 
} 
... 
@end 

Class2.h hala .m dosyaları #import için gerekli başlık dosyası var olacaktır

@class Class1; 

@interface Class2 
{ 
    Class1 * class1_instance; 
} 
... 
@end 

Not

+1

+1 Aslında, bazı insanlar SADECE bu şekilde sizin tarafınızdan yapılmasını şiddetle tavsiye eder. kendi kodu Genellikle başlıkta sınıf türüne gereksiniminiz olduğundan (değişkenler, parametreler ve geri dönüş türleri için), içe aktarma zincirinizi basitleştirme eğilimi gösterir ve tüm üstbilgi dosyalarını daha hızlı işlemesini sağlar. Kesinlikle sorunun hemen altında sağlanan SO link @teabot bakın. –

+0

@Quinn Taylor: iyi nokta. Miras için gerekli olmadıkça, hiçbir zaman kendi başlık dosyalarında # içe aktarma özelliğini kullanmıyorum. –

+0

Teşekkürler. Ama bu şekilde çalışmayacak gibi görünmüyor. Kullantığımda bu mesajı alıyorum. "uyarı: alıcı" Class2 "bir ileri sınıftır ve karşılık gelen @interface olmayabilir." Ve bu bileşenlerden birine erişmeye çalıştığımda, bu bileşenin mevcut olmadığını fark eder. Uygun başlık ile kendi üstbilgisini mi kastediyorsunuz? ya da her ikisi de? – treznik

3

A Dairesel bağımlılık genellikle tasarım probleminin bir göstergesidir. Muhtemelen sınıfların biri veya her ikisi de çok fazla sorumluluk sahibidir. Dairesel bağımlılıktan ortaya çıkabilen bir refactoring, birbirine bağlı işlevselliği, her iki orijinal sınıfın da tükettiği kendi sınıfına taşıyor.

Her sınıfın diğerinden istediği işlevi açıklayabilir misiniz?

+0

Eh. Temel olarak Class1, bir eşzamansız olarak harici bir görüntü yükleyen bir betiği tetikleyen bir Class2 örneğini oluşturur ve görüntüler yüklendiğinde Class2'den bir yöntem işlenir; bu da Class1'den bir yöntemi tetiklemelidir. O zaman neden ihtiyaç duyduğumdan, görüntü yükünün yanı sıra bazı ek işlevlerin olduğu Sınıf 2'ye neden ihtiyaç duyduğumu merak edebilirsiniz. Hmm, fark ettim, Class1 referanslarını tipinde saklayabilir miyim? – treznik

+0

Bir temsilci veya etkinlik için bir iş gibi görünüyor. Class2, özellikle 1. Sınıf'ın görüntü yükünün tamamlanmasına önem verdiğini bilmemize gerek yok, sadece bu konuda bilmek isteyen başkaları var.Sınıf 2, görüntü yükü tamamlandığında patlayacağı bir olayı/bildirimi ortaya çıkarmalıdır. Tüketiciler, abonelikten ve bildirim gerçekleştiğinde ne yapmaları gerektiğinden sorumludur. –

+2

Nesneler arasında gevşek şekilde bağlanmış iletişimi gerçekleştirmenin birçok yolu vardır: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –