it-swarm.dev

delege ve Bildirim arasındaki fark nedir?

delege ve Bildirim arasındaki fark nedir?

temsilci ve protokol gibi anladım,

@protocol classADelegate

-(void)DelegateMethod;


@end



classB <classADelegate>{

   classA *ObjOfclassA=[[classA alloc]init];

    ObjOfclassA.delegate=self;

//while Push later, here we have taken the pointer of classB(self) to classA and stored in delegate variable of classA. so from classA we can call the function in classB

   Push:classA from here.


   -(void)DelegateMethod{

        nslog(@"i am rithik from India");


     }

}


classA{

   id <classADelegate> delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}

Benim şüphem

1 neden A sınıfında böyle kullanmıyoruz

classA{

**classB** <classADelegate> delegate;


[self.delegate DelegateMethod];

}

" id " kullanımının sebebi nedir ve aralarındaki fark nedir?

2 protokol tanımından gelen classB'nin DelegateMethod işlevinin yöntemini çağırdık.

bunun yerine, classB.'nin bu örnek metodunu tanımlayarak doğrudan bu metodu çağırabiliriz.

bunun gibi.

classB{

-(void)DelegateMethod;

}

ve sonra bunu ara

classA{

       classB delegate;

       -(void)viewdidload{

            [self.delegate DelegateMethod];

        }

    }

bu yüzden yukarıdakilerden = protokolden ve id değişkeninden uzak durduk.

ama çoğumuzun delege ve protokol kullandığını biliyordum. burada temsilci ve protokolü kullanırken herhangi bir avantaj hakkında bilmek geldi

burada DelegateMethod işlevinin yöntemi için protokol uygulamasının kullanımı nedir.

bunun yerine örnek tanımı.

@totocol ile bunların kullanımı nedir.

herhangi biri bana doğru yönde rehberlik edin ...

ben iphone geliştirme için yeniyim.

şu anda nasıl delege oluşturulacağını biliyordum. Fakat NSNotification hakkında çalışmaya geldim.

bu aynı zamanda delege gibi neredeyse doğru işi yapmaktır.

öyleyse ne zaman delgate'i veya NSnotification'ı kullanmalıyım?.

ThankU

19
rithik

Kısa Cevap: Bir telefon görüşmesi gibi delegeleri düşünebilirsiniz. Arkadaşını çağırıyorsun ve özellikle onlarla konuşmak istiyorsun. Bir şey söyleyebilirsin ve cevap verebilirler. Telefonu kapatıncaya kadar konuşabilirsiniz. Temsilciler, aynı şekilde, iki nesne arasında bir bağlantı oluşturur ve temsilcinin ne tür olacağını bilmek zorunda değilsiniz, protokolü uygulamak zorundadır. Öte yandan, NSNotifications bir radyo istasyonu gibidir. Mesajını dinlemek isteyenlere yayınlarlar. Radyo istasyonu dinleyicilerinden geri bildirim alamaz (bir telefon veya delege olmadığı sürece). Dinleyiciler mesajı görmezden gelebilir veya onunla bir şeyler yapabilirler. NSNotifications, herhangi bir nesneye mesaj göndermenizi sağlar, ancak ileri geri iletişim kurmak için aralarında bir bağlantı bulunmaz. Bu iletişime ihtiyacınız varsa, muhtemelen bir delege uygulamanız gerekir. Aksi takdirde, NSNotifications daha basit ve kullanımı kolaydır, ancak başınızı belaya sokabilir.

Uzun cevap:

Delegeler genellikle, başkalarının kullanması için bir çerçeve oluşturuyorsanız, işleri yürütmek için daha uygun bir yoldur. Delegelerinizle protokolleri kullanırken gerekli yöntemleri kontrol etmek için derleme zamanı kazanırsınız, böylece herhangi bir gerekli yöntemi kaçırıp toplamadığınızı derlersiniz. NSNotificationCenter ile böyle bir garantiniz yoktur.

NSNotificationCenter tür "hack-ish" dır ve yapabilen zayıf mimariye öncülük eden acemi programcılar kullanılır. Çoğu zaman bu iki özellik birbirinin yerine geçebilir, ancak daha "sert" geliştiriciler NSNotificationCenter'ın kullanımında isabet edebilir.


Q: "id" kullanımının sebebi nedir ve bunların farkı nedir?

A:idişlevini kullanmak, yönteme herhangi bir nesneyi parametre olarak göndermenizi sağlar. İlgili Obje sarmalayıcılarına sarılmamışlarsa, bool, float, double, ints, vb. Gibi primitifler gönderemeyeceğinizi unutmayın.


classB{

-(void)DelegateMethod;

}

ve sonra bunu ara

classA{

   classB delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}

Sağladığınız yukarıdaki örnek, classAname __ 'ın temsilcisinin daima avantajlı olmayan classBtipinde olmasını gerektirir. Bu senaryoda delegelerin kullanılması yerine, muhtemelen sadece diğer sınıfınıza atıfta bulunulan bir değişkeni kullanırsınız, örneğin, myClassBname__. Delegelerin güzelliği, herhangi bir nesnenin etrafından geçebilmenizdir ve kod yalnızca gerekli yöntemleri uyguladıkları sürece çalışır (derleyicinin sağladığı, doğru delege türü olarak işaretlendiği sürece).

105
FreeAsInBeer

Bir temsilci protokolleri kullanır ve iki sınıf arasında bir has-a ilişkisi oluşturur. Delegelerin diğer yararlarından biri de mülk sınıfına geri dönebilmenizdir.

Öte yandan, bildirimler çok noktadan iletişime yönelik noktalara yöneliktir. NSNotification kullanmanın bir örneği, belirli bir olayın çoklu görünüm denetleyicilerini bildirmeniz gerekebilecek, böylece verileri yenileyebilecekleri vb. Bir sekme çubuğu denetleyicisi uygulamasında olabilir. Bu, birbirleri hakkında bilgi sahibi olmayan sınıflar için mükemmeldir. Yapsalar bile mantıklı olmazdı.

Şimdi, diğer sorularınız için:

Neden id kullanıyoruz?
Sınıfınızda, belirsiz tip nesnesine bir tutamaç istiyorsunuz, ancak tanımladığınız protokolü uygularsınız. Örneğin, UIWebView atın. Temsilci olabilen sınırsız sayıda sınıf olabilir, bu nedenle belirli bir sınıfın adını belirtmemeli, ancak sınıfın UIWebViewDelegate protokolünü uygulaması gerektiğini belirtin. Bu, kuplajı mutlak bir minimuma indirir ve durum değil davranış 'a dayalı etkileşim oluşturduğunuzda çok yapışkan bir uygulama oluşturur.

Öyleyse bir örnek üzerinden geçelim:

@protocol ClassADelegate
- (NSString*) determineValue;
@end

@interface ClassA : NSObject
{
    id<ClassADelegate> delegate;
}
//  Make sure you are using assign, not retain or copy
@property (nonatomic, assign) id<ClassADelegate> delegate;

@end

ClassA uygulaması:

import "ClassA.h"

@implementation ClassA
@synthesize delegate;

- (void) somePrivateMethod
{
    if (self.delegate && [self.delegate implementsProtocol:@protocol(ClassADelegate)])
    {
        NSString* value = [self.delegate determineValue];

        // Do other work
    }
}

- (void) dealloc
{
    delegate = nil;
}

@end

Başlıkta, sınıfın ClassADelegate protokolünü uygulayacağını ilan ediyoruz:

#import "ClassA.h"

@interface ClassB : NSObject <ClassADelegate>
{
}

- (void) someMethod;

@end

ClassB uygulamasında, ClassA örneğini oluşturur ve A'nın temsilcisi olarak B değerini ayarlarız:

#import "ClassB.h"
@implementation ClassB

- (void) someMethod
{
    ClassA* aClass = [[ClassA alloc] init];

    aClass.delegate = self;

   // Other work and memory clean up of A.
   // Some logic occurs in A where it calls the delegate (self) which will 
   // call the `determineValue` method of this class.
}

//  Here's the delegate method we implement
- (NSString*) determineValue
{
    return @"I did some work!";
}

@end
13
Wayne Hartman

Delege, iletiyi bir nesneden diğer nesneye geçiriyor. Bilgilendirme birebir iletişim gibidir, bildirim aynı anda birden çok nesneye mesaj iletmek gibidir. Bu bildirime abone olan veya bildirime hareket eden diğer tüm nesneler bu olaya yanıt verebilir veya cevap veremez. Bildirimler daha kolaydır ancak kötü mimari gibi olanları kullanarak başınız derde girebilir. Delegeler daha sık kullanılır ve protokollerin yardımı ile kullanılır.

3
Aman Pathak

Bildirimleri çeşitli nedenlerle kullanabiliriz. Örneğin , kullanıcı arabirimi öğelerinin programın herhangi bir yerindeki belirli bir olaya dayanarak bilgileri görüntüleme şeklini değiştirmek için bir bildirim yayınlayabilirsiniz. Veya bir belgedeki nesnelerin, belge penceresi kapanmadan önce durumlarını kaydetmesini sağlamak için bildirimleri kullanabilirsiniz.

Bildirimlerin genel amacı, program olaylarının diğer nesnelerini uygun şekilde yanıt verebilmeleri için bilgilendirmektir. Ancak bildirim alan nesneler yalnızca etkinlik gerçekleştikten sonra tepki verebilir. Bu, heyetten önemli bir farktır.

Delegeye delegasyon nesnesinin önerdiği işlemi reddetme veya değiştirme şansı verilir. Öte yandan, nesneleri gözlemlemek, yaklaşmakta olan bir işlemi doğrudan etkileyemez.

0

Sadece söyleyebiliriz,

Delegeler:

Bire bir

Bildirim:

Bire Bir

Delege ilan etmek

@protocol DelegateName
@required
- (void)method:(NSString *)param;
@optional
- (void)methodOptional:(NSString *)param;
@end

Ve Protokol için bir özellik ilan edin

@property id <DelegateName> delegate;

Kullanabilirsiniz

myObject.delegate = <# some object conforming to DelegateName #>;

NSNotification bildirimi

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(notificationHappened:)
                                             name:MyCustomNotificationName
                                           object:nil];

Sonra Uygula

- (void)notificationHappened:(NSNotification *)notification {
    // do work here
}

Kullanarak istediğiniz yerden Bildirim gönderebilirsiniz,

[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName
                                                    object:self
                                                  userInfo:nil];

i̇şiniz bittiğinde removeObserver: arayın.

0
Lal Krishna