2009-04-18 21 views
9

Bu kod oldukça basit, değil mi? Init yöntemiyle aktarılan temsilci tutmam gerekip gerekmediğini bilmiyorum.Delegeler hakkında soru

@interface SomeClass : NSObject { 
    SomeClassDelegate *someClassDelegate; 
} 
-(id)initWithDelegate:(SomeClassDelegate *)delegate; 
@end 

@implementation SomeClass 
-(id)initWithDelegate:(SomeClassDelegate *)delegate 
{ 
    [delegate retain]; // should I be doing this? 
    someClassDelegate = delegate; 
} 
-(void)dealloc 
{ 
    [delegate release]; // obviously only do this if I DO need to retain it 
    [super dealloc]; 
} 
@end 

İlk düşüncem hayır, ancak bu kod biraz farklı görünüyor. Sayımı koruyamayacağımı biliyorum, ancak delegelerle başa çıkmanın uygun yolunu bilmek istiyorum.

// self's retain count is 1 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
// the retain count is now 2, did the init of URLConnection retain self? 
+1

NSURLConnection biraz özel bir durumdur. Delegeyi elinde tutması o kadar da fazla değil, ancak bağlantı süresi boyunca onu korur çünkü delegelerin mesajlarını almayı durdurmanın tek yolu bağlantıyı iptal etmektir. yani normal olarak bir temsilci tutmaz ve NSURLConnection'ın bunun gibi davranışı bir uygulama detayıdır; Güvenmeniz gereken veya genellikle taklit edeceğiniz bir şey değil. Ayrıca, bir delegenin _class_ olması alışılmadık bir durumdur. Normalde bir temsilci protokolü bildirirsiniz. –

+0

Teşekkürler Mike, ne gördüğümü açıklıyor. – Jab

cevap

11

Hayır, genel olarak, temsilci tutamazsınız. Temsilci zaten nesnesine bir başvuruda bulunduğundan, temsilci tuttuysanız, temel olarak bir döngüsel başvuru oluşturur. Ayrıca, aynı sebepten dolayı, delege imha edilmeden önce nesnenizin imha edileceğini varsayabilirsiniz. Delegeleri kullanma/uygulama hakkında daha fazla bilgi için thesearticles.

DÜZENLEME: Başkaları tarafından işaret edilen birkaç istisna vardır.

+0

Makaleler için teşekkürler, delege inancımı doğruladınız. Mike ayrıca, sorularımın nedeninde NSURLConnection ile gördüğümü neden gördüğümü açıkladı. – Jab

+2

Duruma bağlı olarak, nesneniz ilk önce yok edilmeyebilir, ancak en azından temsilci ayrılmayacaktır. (örnek: UIAccelerometer) – rpetrich

1

htw'de belirtildiği gibi, genellikle temsilci tutmamalısınız. Çok iş parçacıklı bir ortamda, çoğu kez, yalnızca bir yöntem çağrısı süresine rağmen, arkasından geçersiz kılınmadığından emin olmak için ihtiyacınız olan her şeyi korumanız gerekir. Örneğin, (aslında durum değil), -[NSURLConnection initWithRequest:delegate], iş parçacığının sahip olabileceği yeni bir iş parçacığı oluşturdu (daha sonra muhtemelen parametrelerini otomatik olarak). Gerçekte, NSURLConnection, bağlantı süresi boyunca temsilcisini koruduğu için özel bir durumdur.