2011-01-19 15 views
5

Böyle inline gibi işlevleri ilan edebilir: DEBUG değilken optimize ve satır içi çünkü işleve hiçbir maliyet yokObjective-C'de statik sınıf yöntemlerini uygulayabilir miyim?

#ifdef DEBUG 
void DPrintf(NSString *fmt,...); 
#else 
inline void DPrintf(NSString *fmt,...) {} 
#endif 

böylece. Ya aynı şeyi yapmak istersiniz ama bir sınıf yöntemi için?

Sınıfım böyle ilan edilir:

@interface MyClass : NSObject { 

} 

    + (void)DPrintf:(NSString *)format, ...; 
    // Other methods of this class 
@end 

ben yöntemi çağrılırken için hiçbir maliyeti yoktur, böylece inline benzer bir şeye 'DPrintf' dönüştürmek istiyorum.

Ama bunu yapamaz:

inline +(void)DPrintf:(NSString *)format, ...; {} 

Nasıl bir sınıfın bir sıfır maliyetli statik yöntem olmayan ayıklama derlemeler için kapatılabilir olabilir?

cevap

8

Dikkatli olun. Amaç-C yöntemleri C fonksiyonları ile aynı değildir. Bir Objective-C yöntemi derleyici tarafından objc_msgSend() işlev çağrısına çevrilir; Bir yöntemin satır içi olup olmadığını kontrol edemezsiniz, çünkü bu konuyla ilgisizdir. Objective-C çalışma zamanı here (Objective-C Runtime Programming Guide), here (Objective-C Runtime Reference) ve here (CocoaSamurai post) hakkında daha fazla bilgi edinebilirsiniz ve hızlı bir Google araması daha fazla bilgi getirmelidir.

+4

Ayrıca, erken optimizasyona dikkat edin. Yazdırma işi olan bir işlevin satır içi işaretlemesi, işlev çok fazla çağrılsa bile, çok fazla zaman tasarrufu sağlamaz. Inlining çoğunlukla geri dönüşün hesaplanması çok kolay olduğu için anlamlıdır, bu yüzden fonksiyon çağrısı yükü önemlidir. Herhangi bir printf varyasyonu içeren hiçbir şey, aranan talimatların sayısı açısından kolay değildir. –

+4

Günümüzde, çoğu modern derleyicilerin (GCC veya Clang olsun) genel olarak kendi başlarına iyi işleyen fonksiyonları nasıl tanıyacaklarını bilirler ve bunları kendileri gibi işaretlerler. İnsanlar hangi fonksiyonların iyi bir şekilde çalıştığını tahmin etmede kötü bir şekilde kötüdür, bu yüzden derleyicinin bunu anlaması için tek başına bırakmanız önerilir (bazı C derleyicilerinden duydum. dikkatli). –

6

Objective-C'de statik yöntem diye bir şey yoktur. Sınıflara ait olmaları dışında, örnek yöntemlere benzeyen yalnızca sınıf yöntemleri vardır. Bu, örnek yöntemlerde olduğu gibi, bir sınıfa gönderilen bir iletinin, çağrı için doğru yöntemi belirlemek için ileti gönderme makinesinden geçmesi gerektiği ve bu, çalışma zamanında yapıldığı anlamına gelir. Yöntem gönderme yöntemine yapılan çağrıyı inline edebilirsiniz, ancak yöntem gövdesi, şu anda herhangi bir Objective-C derleyicisinde bulunmayan çılgın bir optimizasyon düzeyi olmadan satır içi olarak yapılamaz.

Her halükarda, bu bir mikro optimizasyondur. Profilleme gerekli olduğunu gösterirse (ki bu neredeyse hiç olmaz), o zaman jimnastikten geçebilirsiniz. Aksi takdirde, uygulamanızdaki gerçek performans endişeleri hakkında endişelenin.

+3

Sınıf yöntemleri ve statik yöntemlerin eş anlamlı olduğu bir Java arka planından gelen (benim gibi) olanlar için, Objective-C sınıfı yöntemlerinde dinamik olarak çözüldüğünü, yani sınıf nesneleri üzerinde çalışmanın "statik" olmadıklarını unutmayın. http://en.wikipedia.org/wiki/Method_(computer_programming) –

İlgili konular