SORU
9 Mart 2009, PAZARTESİ


Nasıl Objective-C temsilciler oluşturabilirim?

Delegeler nasıl çalıştığını biliyorum, ve bunları kullanmak gerektiğini çok iyi biliyorum.

Ama onları nasıl oluşturabilirim?

CEVAP
9 Mart 2009, PAZARTESİ


Objective-C bir temsilci delegate özelliği başka bir nesneye atanmış olan bir nesnedir. Bir tane oluşturmak için, sadece temsilci protokolün uygulanması olarak ilgilendiğiniz temsilci yöntemler uygulayan, sınıf işareti olan bir sınıf tanımlayın.

Örneğin, UIWebView olduğunu varsayalım. Eğer onun temsilci 32 ** yöntemi uygulamak istiyorsanız, bu gibi bir sınıf oluşturabilirsiniz:

@interface MyClass<UIWebViewDelegate>
// ...
@end

@implementation MyClass
- (void)webViewDidStartLoad:(UIWebView *)webView { 
    // ... 
}
@end

Sonra Sınıfım örneği oluşturmak ve web görünümü temsilci olarak atayabilirsiniz:

MyClass *instanceOfMyClass = [[MyClass alloc] init];
myWebView.delegate = instanceOfMyClass;

UIWebView tarafında, muhtemelen eğer temsilci webViewDidStartLoad: ileti respondsToSelector: kullanarak yanıt olmadığını görmek için buna benzer bir kod var ve eğer uygunsa gönderin.

if([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
    [self.delegate webViewDidStartLoad:self];
}

Temsilci özelliği kendisi tipik olarak ilan etti weak (ARC) veya assign (pre-ARC) önlemek korumak döngüler beri temsilci nesnesi genellikle tutan güçlü bir referans nesnesi. (Örneğin, görünüm denetleyicisi genellikle içeren bir bakış temsilci.)

Sınıflar için Delege yapma

Kendi delegeleri belirlemek için, Apple Docs on protocols anlatıldığı gibi yöntemleri bir yere bildirmek gerekiyor. Genellikle resmi bir protokol bildirin. Bildirgede, UİWebView gelen başka sözcüklerle ifade.h, bu gibi görünecektir:

@protocol UIWebViewDelegate <NSObject>
@optional
- (void)webViewDidStartLoad:(UIWebView *)webView;
// ... other methods here
@end

Bu temsilci, bu durumda UİWebViewDelegate için özel bir tür oluşturur gibi bir arayüz veya soyut temel sınıf paraleldir. Temsilci uygulayıcıları bu Protokolü kabul etmek gerekir:

@interface MyClass <UIWebViewDelegate>
// ...
@end

Ve sonra protokolde yöntemleri uygulamak. Yöntemleri @optional protokolünde bildirilen (en temsilci yöntemleri gibi), belirli bir yöntem çağırmadan önce -respondsToSelector: ile kontrol etmeniz gerekir.

Adlandırma

Temsilci yöntemler genellikle delege sınıf adı ile başlayan adlandırılır ve ilk parametre olarak bir delege nesnesi. Onlar da sık sık gerekir mi, yoksa form olacak, bir kullanın. Yani webViewDidStartLoad: (ilk parametre web görünümü) yerine loadStarted (herhangi bir parametre alarak) Örneğin.

Hız İyileştirmeleri

Bir temsilci seçici yanıt verip vermediğini kontrol etmek yerine her zaman mesaj vermek istiyoruz, delegeler ayarlandığında bu bilgileri önbelleğe alabilir. Bunu yapmak için çok temiz bir şekilde aşağıdaki gibi bir bit kullanın

@protocol SomethingDelegate <NSObject>
@optional
- (void)something:(id)something didFinishLoadingItem:(id)item;
- (void)something:(id)something didFailWithError:(NSError *)error;
@end

@interface Something : NSObject
@property (nonatomic, weak) id <SomethingDelegate> delegate;
@end

@implementation Something {
  struct {
    unsigned int didFinishLoadingItem:1;
    unsigned int didFailWithError:1;
  } delegateRespondsTo;
}
@synthesize delegate;

- (void)setDelegate:(id <JSSomethingDelegate>)aDelegate {
  if (delegate != aDelegate) {
    delegate = aDelegate;

    delegateRespondsTo.didFinishLoadingItem = [delegate respondsToSelector:@selector(something:didFinishLoadingItem:)];
    delegateRespondsTo.didFailWithError = [delegate respondsToSelector:@selector(something:didFailWithError:)];
  }
}
@end

SONRA, VÜCUTTA, bizim temsilci tekrar tekrar -respondsToSelector: gönderme delegateRespondsTo yapı girerek yerine iletileri işleyen kontrol edebiliriz.

Resmi Olmayan Temsilciler

Protokoller var olmadan önce, ortak NSObject category bir temsilci uygulamak yöntemleri bildirmek için kullanın. , 26* *hala örneğin bu:

@interface NSObject(CALayerDelegate)
- (void)displayLayer:(CALayer *)layer;
// ... other methods here
@end

Bu aslında herhangi bir nesne displayLayer: uygulayabilir derleyici söyler.

O zaman yukarıda bu yöntemi çağırmak için açıklandığı gibi -respondsToSelector: aynı yaklaşımı kullanabilirsiniz. Delegeler sadece bu yöntemi uygulamak ve delegate özelliği atamak, ve o (bir protokol için uygun ilan yok). Bu yöntem yaygın olarak Apple'ın kitaplıklar, ama yeni bir kod kullanmanız gerekir daha modern protokolü yaklaşım şeyden beri bu yaklaşım kirletiyor NSObject (otomatik tamamlama yapar daha az yararlı) ve zorlaştırıyor için derleyici hakkında sizi uyarır yazım hataları ve benzeri hatalar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DJPixcell

    DJPixcell

    20 NİSAN 2007
  • bored before i even began

    bored before

    30 Mart 2009
  • Santozz Yazz

    Santozz Yazz

    23 Mart 2014