委托和通知之间有什么区别?

rit*_*hik 19 iphone xcode cocoa cocoa-touch objective-c

委托和通知之间有什么区别?

我理解像代表和协议,

@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];

    }

}
Run Code Online (Sandbox Code Playgroud)

我怀疑是

1为什么我们不在这样的classA中使用

classA{

**classB** <classADelegate> delegate;


[self.delegate DelegateMethod];

}
Run Code Online (Sandbox Code Playgroud)

使用" id " 的原因是什么?它们的区别是什么?

2我们调用了classB的DelegateMethod函数的方法,它来自协议定义.

相反,我们可以通过定义classB的实例方法来直接调用该方法.因为我们在classA的委托变量中得到了classB的指针.

像这样.

classB{

-(void)DelegateMethod;

}
Run Code Online (Sandbox Code Playgroud)

然后调用它

classA{

       classB delegate;

       -(void)viewdidload{

            [self.delegate DelegateMethod];

        }

    }
Run Code Online (Sandbox Code Playgroud)

所以从上面我们已经避免了协议和id变量.

但我知道我们很多人都使用委托和协议.在这里,我了解了使用委托和协议时的任何优势

这里是DelegateMethod函数方法的协议实现的用法.

而是实例定义.

@protocol的用法是什么?

请任何人指导我正确的方向......

我是iphone开发的新手.

现在我知道如何创建代表.但是当我开始研究NSNotification时

这也像委托一样做了几乎正确的工作.

所以什么时候应该使用delgate或NSnotification.

感谢你

Fre*_*eer 108

简答:您可以将代表视为电话.你打电话给你的好友,特别想与他们交谈.你可以说点什么,他们可以回应.你可以说话,直到你挂断电话.代理以同样的方式在两个对象之间创建链接,并且您不需要知道委托的类型,它只需要实现协议.另一方面,NSNotifications就像一个广播电台.他们向愿意倾听的人传达他们的信息.广播电台无法接收来自听众的反馈(除非有电话或代表).听众可以忽略该消息,或者他们可以使用它做一些事情.NSNotifications允许您向任何对象发送消息,但是它们之间不会有来回通信的链接.如果您需要此通信,则应该实现委托.否则,NSNotifications更简单易用,但可能会让您遇到麻烦.

答案很长:

代表通常是处理事物的更合适的方式,特别是如果您正在为其他人创建框架以供使用.当您与代理使用协议时,您将获得编译时检查所需的方法,因此如果您缺少任何必需的方法,您就知道何时编译.使用NSNotificationCenter,您没有这样的保证.

NSNotificationCenter是一种 "hack-ish",经常被新手程序员使用,这导致糟糕的架构.很多时候这两个功能是可以互换的,但更多"硬核"开发人员可能会嘲笑NSNotificationCenter的使用.


问: 使用"id"的原因是什么?它们的区别是什么?

答:使用id允许您将任何对象作为参数发送到方法.请注意,您不能发送诸如bools,float,double,int等原语,除非它们包含在各自的Object包装器中.


classB{

-(void)DelegateMethod;

}
Run Code Online (Sandbox Code Playgroud)

然后调用它

classA{

   classB delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}
Run Code Online (Sandbox Code Playgroud)

您提供的上述示例将要求classA委托始终属于类型classB,这是不利的.您可能只使用引用其他类的变量,而不是在此方案中使用委托myClassB.委托的优点在于您可以传递任何对象,只要代码实现所需的方法(编译器确保,只要它被标记为正确的委托类型),代码就可以正常工作.

  • 收音机/电话示例+1;)我希望你在我的Grad日期间成为我的老师; ) (12认同)
  • 我完全不同意通知是"hack-ish",至少本质上是这样.委派对于紧密耦合或相关的对象非常有用,并且非常适合一对一通信.通知是为了更松散的关系或一对多的沟通.他们*可以*以"hack-ish"的方式使用,但代表也可以. (11认同)

Way*_*man 14

委托使用协议并has-a在两个类之间创建关系.代表的另一个好处是,您可以将某些东西归还给拥有的班级.

另一方面,通知更倾向于指向多点通信.使用an的示例NSNotification可能在标签栏控制器应用程序中,您可能需要通知多个视图控制器特定事件,以便他们可以刷新数据等.这对于彼此不了解的类非常有用如果他们这样做,那就没有意义.

现在,问你的其他问题:

我们为什么要用id
在您的类中,您需要一个不确定类型对象的句柄,但它实现了您定义的协议.就拿UIWebView,例如.可以有无穷小类的类可以作为它的委托,因此,它不应该命名特定类型的类,而是指定类必须实现UIWebViewDelegate协议.这会将耦合降低到绝对最小值,并创建一个高度内聚的应用程序,您可以根据行为创建交互,而不是状态.

那么,让我们来看一个例子:

@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
Run Code Online (Sandbox Code Playgroud)

执行ClassA:

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
Run Code Online (Sandbox Code Playgroud)

在标题中,我们声明该类将实现ClassADelegate协议:

#import "ClassA.h"

@interface ClassB : NSObject <ClassADelegate>
{
}

- (void) someMethod;

@end
Run Code Online (Sandbox Code Playgroud)

在实现中ClassB我们创建一个实例ClassA并设置B为A的委托:

#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
Run Code Online (Sandbox Code Playgroud)