AppDelegate nedir ve ne zaman kullanılacağını nasıl bilebilirim?


146

İPhone uygulamalarında çalışmaya başladım. Özel bir sınıfa karşı AppDelegate'e ne zaman bir şeyler koymam gerektiğini nasıl anlarım? Python veya PHP gibi AppDelegate benzeri bir desen kullanan başka bir programlama dili ile bir kural veya herhangi bir benzerlik var mı?

Yanıtlar:


255

Normalde Andrew'un "başvurunuzun kalbi" terimini kullanmasının ima ettiği tasarım yaklaşımından kaçınırım. Bununla kastettiğim şey, merkezi bir konuma çok fazla şey atmaktan kaçınmanız gerektiğini düşünüyorum - iyi program tasarımı normalde işlevselliği "endişe alanı" ile ayırmayı içerir.

Temsilci nesne, bağlandığı nesne belirli olaylara veya durumlara ulaştığında bildirim alan bir nesnedir. Bu durumda, Uygulama Temsilcisi, UIApplication nesnesi belirli durumlara ulaştığında bildirim alan bir nesnedir. Birçok açıdan, özel bire bir Gözlemci örüntüsüdür.

Bu, AppDelegate için "endişe konusu" özel UIA uygulama durumlarını ele aldığı anlamına gelir. Bunlardan en önemlileri:

  • applicationDidFinishLaunching: - başlangıçtaki yapılandırma ve yapım işlemleri için iyi
  • applicationWillTerminate: - sonunda temizlik için iyi

AppDelegate'e başka işlevler koymaktan kaçınmalısınız çünkü onlar gerçekten oraya ait değildir. Bu tür diğer işlevler şunları içerir:

  • Belge verileri - bir belge yöneticisi singletonuna (birden çok belge uygulaması için) veya bir belge singletonuna (tek belge uygulamaları için) sahip olmalısınız
  • Düğme / tablo / görünüm denetleyicileri, görünüm delege yöntemleri veya diğer görünüm işleme (applicationDidFinishLaunching :) üst düzey görünümünün oluşturulması hariç - bu çalışma ilgili görünüm denetleyicisi sınıflarında olmalıdır.

Birçok kişi tembel oldukları veya AppDelegate'in tüm programı kontrol ettiğini düşündükleri için bunları AppDelegate'lerine götürüyor. AppDelegate'inizde merkezileşmekten kaçınmalısınız çünkü uygulamadaki endişe verici alanları karıştırır ve ölçeklendirmez.


8
+1 Bu mükemmel bir cevap. Ben alt görünümleri appDelegate farklı bir alt görünüme geçmek için bir görünüm denetleyicisi talimat yapmak ve bazı kod kokusu gibi hissettim çağrı bazı örnek kod bakıyordu. Burnumun hala çalıştığını bilmek güzel.
Alan

2
bazen çevrimiçi derslerde böyle bir şey görüyoruz: AppDelegate * del = [AppDelegate sharedAppDelegate]; (bkz. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) bu ne anlama geliyor? kullanma örnekleri görebilirsiniz ama gerçekten arkasındaki teori anlamıyorum (bu örneğe bakın: developer.apple.com/library/ios/#samplecode/… )
abbood

27

Uygulama temsilciniz, uygulamanızın kalbidir. Etkin bir şekilde "Program Denetleyiciniz" dir.

Uygulama Temsilcisi, diğer görünümlerin oluşturulmasını başlatmak için en yaygın olarak kullanılan applicationDidFinishLaunching iletisi de dahil olmak üzere uygulama düzeyinde iletileri alan sınıftır.

Tam olarak benzer olmasa da, onu Kakao programınızın "ana ()" rutini olarak düşünebilirsiniz.


Size +1 veriyorum çünkü AppDelegate'teki tüm UI denetleyicilerine sahip olmak, tüm bu özel sınıfları oluşturmaktan daha az güçlük çekiyor.
rwols

3
@ rwols dikkatli olun, endişelerinizi ayırmak daha temiz bir kod için yardımcı olur ve hata ayıklama zahmetinden daha azdır, bu özel sınıfı oluşturmak için zaman ayırmalı ve tüm gözlemcilerinizi tek bir dosyaya koymamalısınız.
wheeliez

2

@ Şaşam, teşekkürler.

Anladığım kadarıyla, Android'de appDelegatebir olana yakın Application. viewDidLoad, viewDidDisappearAndroid'in Yaşam Döngüsü nedir karşılaştırılabilir. Her uygulamanın, gelen çağrılardan gelen çağrılardan kesintilere, gösterilen bildirimlere kadar bir yaşam döngüsü vardır. Bu systemolaylar gerçekleştiğinde özel bir şey yapmak için kodunuza ihtiyacınız varsa , yöntemleri kod yazmanız gerekir.

Kullandığımız Android yılında onPause, onDestroy, onCreatetür tür sistem olaylarını işlemek için yöntemler callback.


onPause, onCreateVe onDestroyAndroid'in yöntemleri daha benzer viewDidDisappear, viewDidLoadbir iOS gör Kontrolörünün yaşam döngüsü yöntemleri. Karşılaştırmanız gerekiyorsa, ApplicationAndroid sınıfının AppDelegateiOS'a daha yakın olacağını söyleyebilirim .
Shivam Bhalla

Teşekkürler, cevabımı daha iyi yapabilirsen lütfen yap. Sizinkini okuduktan sonra cevabımı sileceğim.
Siddharth

1

Umarım bu biraz daha yardımcı olur ...

Bu dilde yeni olan programcılar her zaman aynı soruya sahiptir - program ana bir yöntemden mi başlıyor? Evet, bu durumda haklısınız; IOS uygulamaları da ana bir yöntemden başlar.
Ana sınıfınız aşağıdaki işlevi çağırır:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain, bir UIApplicationnesne oluşturan Cocoa Touch çalıştırma döngüsünü ve uygulama altyapısını başlatıyor . Uygulamamızın içeriğe ihtiyacı var, bu yüzden objektif-c bununla başa çıkmak için bir temsilci kullanır. Bu yüzden buna AppDelegate diyoruz (delege olarak hareket ediyoruz UIApplication). Bu temsilcinin bazı isteğe bağlı yöntemlerini uygularız ve buna göre davranır.


lütfen birisi bana yukarıdaki cevabın ne olduğunu yanlış anlamamı sağlar
Anurag Bhakuni

2
Bu karışık görünüyor çünkü a) doğru noktalama / yazım / dilbilgisi kullanmıyorsunuz, b) orijinal posterin sorduğu soruya gerçekten cevap vermediğinden konu dışı.
Kay
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.