Objective-C'de kullanılmayan yöntemler ve #import nasıl tespit edilir


100

Bir iPhone uygulamasında uzun bir süre çalıştıktan sonra, kodumun oldukça kirli olduğunu, birkaç # ithalat ve çağrılmayan veya hiç kullanılmayan yöntemler içerdiğini fark ettim.

Herhangi bir derleyici yönergesi veya bu işe yaramaz kod satırlarını tespit etmenin bir yolu olup olmadığını bilmek istiyorum. Xcode'un bunu algılamak için herhangi bir aracı var mı?

Yanıtlar:


66

Xcode, sizi bazı kullanılmayan kod türleri konusunda uyarabilecek belirli derleyici uyarıları için ayarları kontrol etmenizi (kaldırmanızı) sağlar. (Kaynak listesinden projeyi seçin ve Dosya> Bilgi Al, ardından Oluştur sekmesini seçin.) İşte ilginizi çekebilecek birkaç (Clang ve GCC 4.2 için gösterilenler):

  • Kullanılmayan İşlevler
  • Kullanılmayan Parametreler
  • Kullanılmayan Değerler

Kullanılmayan içe aktarmaları tespit etmek için herhangi bir seçenek görmüyorum, ancak bu biraz daha basit - düşük teknoloji yaklaşımı, bir derleme hatası / uyarısı alana kadar içe aktarma ifadelerini yorumlamaktır.

Kullanılmayan Objective-C yöntemlerini tespit etmek, kullanılmayan C işlevlerine göre çok daha zordur çünkü mesajlar dinamik olarak gönderilir. Bir uyarı veya hata, olası bir sorununuz olduğunu size söyleyebilir, ancak sorunun olmaması, çalışma zamanı hatalarınızın olmayacağını garanti etmez.


Düzenleme: Kullanılmayan yöntemleri (potansiyel olarak) tespit etmenin bir başka iyi yolu da gerçek yürütmelerden gelen kod kapsamını incelemektir. Bu genellikle otomatik birim testiyle birlikte yapılır, ancak böyle olması gerekmez.

Bu blog yazısı , Xcode kullanarak birim testi ve kod kapsamına iyi bir giriş niteliğindedir. gcov(Bu arada yalnızca GCC tarafından oluşturulan kodla çalışan) ile ilgili bölüm, Xcode'un ne sıklıkta yürütüldüğünü kaydedebilen enstrümantasyonlu kod oluşturmak için nasıl elde edileceğini açıklar. Simülatörde bir dönüş için uygulamanızın araçlı bir yapısını alırsanız , ardından gcov'u çalıştırın, CoverStory (oldukça basit bir GUI) veya lcov(HTML raporları oluşturmak için Perl komut dosyaları ) gibi bir araç kullanarak hangi kodun çalıştırıldığını görebilirsiniz. .

Kullandığım gcovve lcoviçin CHDataStructures.framework ve otomatik olarak oluşturun kapsama raporları her SVN sonra işlemek. Yine, yürütülen kapsamı hangi kodun "ölü" olduğunun kesin bir ölçüsü olarak ele almanın akıllıca olmadığını, ancak daha fazla araştırabileceğiniz yöntemleri belirlemenize kesinlikle yardımcı olabileceğini unutmayın.

Son olarak, ölü kodu kaldırmaya çalıştığınız için, bu SO sorusunu da ilginç bulacağınızı düşünüyorum:


4
Ne demek istediğinizden emin değilim ... Statik analizör birçok problem bulabilir, ancak olarak yazılan bir değişkene mesaj gönderirseniz idveya çalışma zamanında çağırmak için bir seçici oluşturursanız, statik analizör garanti edemez kodun gerçekten kullanılmamış olduğunu. Hala ihtiyaç duyulan kod kaldırılırsa, çalışma zamanı hataları alacağınız yer burasıdır. Bir şey mi kaçırıyorum?
Quinn Taylor

1
Ayrıca, çalışma zamanında dizelere göre oluşturulan seçiciler oldukça yaygındır.
dreamlax

1
Elbette, dinamik kodunuzun daha güçlü bir tür atama yöntemiyle sunulmasının daha iyi olabileceği durumlar vardır (yani bir kimlik yerine bir şey döndürmek). Çalışma zamanı yazma, Cocoa / Objective-C programlamasının güçlü bir noktasıdır, ancak bazen bakım ve okunabilirlik, güçlü yazım hakkında daha fazla düşünülerek daha iyi sunulabilir.
alesplin

3
Oh, kesinlikle katılıyorum. Benim genel kuralım, nadiren de olsa bazen gerçekleşen dinamik yazmaya gerçekten ihtiyacım olmadıkça (Java'da olduğu gibi) statik olarak yazmaktır. Ancak, sadece Cocoa sınıflarıyla arayüz oluşturmak (örneğin, bir temsilci belirtmek), izlenmesi zor dinamizm ve yürütme yollarıyla sonuçlanabilir. Heck, bir çalıştırma döngüsü ve birden fazla iş parçacığı olan herhangi bir program önemsiz olmayabilir ...
Quinn Taylor



5

Yakın zamanda kullanılmayan (veya yinelenen) #importifadeleri bulmak için bir komut dosyası yazdım : https://gist.github.com/Orangenhain/7691314

Komut dosyası bir ObjC .m dosyası alır ve #importsırayla her satırı yorumlamaya ve projenin hala derlenip derlenmediğini görmeye başlar . BUILD_DIR & BUILD_CMD'yi değiştirmeniz gerekecek.

Eğer bir kullanıyorsanız findbirden fazla dosya üzerinde komut çalışmasına izin komutu, aslında bir BUILD_CMD kullandığınızdan emin olun kullanan tüm bu dosyaları (veya kullanılmamış ithalat tabloların dolu bir dosya göreceksiniz).

Bunu, AppCode'un benzer bir özelliğe sahip olduğunu bilmeden yazdım, ancak AppCode'u test ettiğimde, bu komut dosyası kadar kapsamlı değildi (ama çok daha hızlı [tüm proje için]).


Yalnızca kopyalar için çalışıyor, kullanılmayan ithalatlar kaldırılmıyor.
Rahul



1

Son zamanlarda büyük bir projeyi Carbon'dan Cocoa'ya değiştirdim. Bunun sonunda, artık kullanılmayan epeyce öksüz dosya vardı. Esasen bunu yapanları bulmak için bir senaryo yazdım:

Kaynağın tümünün yıkıma girdiğinden emin olun (yani temizleyin) Halihazırda hatasız oluşturulduğundan emin olun (yani, xcodebuild 0 durumu döndürür) Ardından, dizindeki her kaynak dosya için boş (yani, içeriği kaldırın, uzunluğu kısaltın) kaynak ve başlık dosyası oluşturmayı deneyin, başarısız olursa dosyaları geri alın, aksi takdirde boş bırakın.

Bunu çalıştırdıktan sonra, geri döndürün ve sonra boşalan tüm dosyaları silin, derleyin ve sonra hata veren tüm # ithalatı kaldırın.

Ayrıca şunu da eklemeliyim, .xib veya .sdef dosyalarından referans alınan dosyalardan kaçınmanız gerekir ve başka dinamik bağlantı durumları olabilir, ancak yine de nelerin silinebileceği konusunda size iyi bir ipucu verebilir.

Aynı teknik, hangi # ithalatın kaldırılabileceğini görmek için kullanılabilir - dosyayı kesmek yerine, sırayla dosyadaki her # ithalatı kaldırın ve derlemenin başarısız olup olmadığına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.