代表如何在Objective-C中工作?

  1. 有没有人知道我在哪里可以find一个很好的解释/教程什么和应用程序委托如何在objective-C
  2. 我所拥有的这两本书并没有充分详细地介绍给delegates ,也没有很好地解释它们,让我真正理解它们的力量和function。

如有疑问,请查看文档 !

基本上,委托是允许对象彼此交互而不会在它们之间创build强相互依赖关系的一种方式,因为这会使应用程序的devise变得更加灵活。 他们可以有一个委托他们发送(或委托)消息给委托,而不是委托他们做,他们做的任何事情,以便对这个消息作出反应和行动,然后通常返回的东西回到另一个对象。

授权也是子类化的更好select。 代替你不得不创build自己的自定义类来稍微改变其他对象的行为方式,或者传递它们的数据,委托允许对象发送消息给自己的委托来为他们工作,而不需要创build子类来进行小的修改其他对象。

当然,委托的主要缺点是,可用的委托方法取决于苹果工程师预见的有用的东西,以及他们期望人们需要的常见实现方式,这些实现方式限制了您可以实现的目标。 尽pipeQuinn Taylor指出,这是Cocoa框架特有的,所以不适用于所有情况。

如果委托是子类化的一个选项,那就把它拿来,因为它是一种更简洁的方式来pipe理你的代码和对象之间的交互。

如上所述,委托并不是iOS或Objective-C的特征,只是一种编程技术,不需要特定的语言支持。

一个类(e,g,classA)可以这样写,使得它的getDatadoSomething方法可以不是由它自己来实现,而是由一个委托来实现(也许因为classA不知道数据是什么或者它将不得不做什么)。

为了达到这个目的,classA提供了一个通常叫做委托delegate)的属性(它只是一个指向类的指针 – 实现委托方法的委托),然后,当它想调用这些方法时,实际上调用了方法代表:

 [self.delegate getData]; 

 [self.delegate doSomething]; 

self.delegate最初可以设置为self

 self.delegate = self; 

即classA实现它自己的这些方法的版本,除非它们被委托。

任何其他类,想成为方法的实现者(即成为委托并可能重写classA的默认实现),将首先将classA的委托设置为自己。 所以如果classB想成为这些方法的代表,那么在classB中,我们会有:

 classA.delegate = self; 

所以当classA调用这些委托方法时,实际上调用了classB来实现这些方法,而不知道classB的任何内容,甚至不存在,classB也不需要classA。

限制是classB只能覆盖classA想要委托的方法 – 通过子类化,你可以覆盖任何方法。

通过定义一个必须由委托实现的方法列表(委托者不提供方法的默认版本,并且该方法必须在某个地方实现),或者可以由委托(可选地由委托实现)来使用协议来forms化委托过程委托人有它自己的版本,或者如果方法没有实现,这没有关系)。

代表是一种devise模式; 没有特殊的语法或语言支持。

委托只是另一个对象在发生某些事情时发送消息的对象,以便委托可以处理原始对象不适用的应用程序特定细节。 这是一种在没有子类化的情况下自定义行为的方法。

我试图通过简单的程序来阐述它

两个类

Student.h

 #import <Foundation/Foundation.h> @interface Student : NSObject @property (weak) id delegate; - (void) studentInfo; @end 

Student.m

 #import "Student.h" @implementation Student - (void) studentInfo { NSString *teacherName; if ([self.delegate respondsToSelector:@selector(teacherName)]) { teacherName = [self.delegate performSelector:@selector(teacherName)]; } NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName); } @end 

Teacher.h

 #import <Foundation/Foundation.h> #import "Student.h> @interface Teacher: NSObject @property (strong,nonatomic) Student *student; - (NSString *) teacherName; - (id) initWithStudent:(Student *)student; @end 

Teacher.m

 #import "Teacher.h" @implementation Teacher - (NSString *) teacherName { return @"ABC"; } - (id) initWithStudent:(Student *)student { self = [ super init]; if (self) { self.student = student; self.student.delegate = self; } return self; } @end 

的main.m

 #import <Foundation/Foundation.h> #import "Teacher.h" int main ( int argc, const char* argv[]) { @autoreleasepool { Student *student = [[Student alloc] init]; Teacher *teacher = [[Teacher alloc] initWithStudent:student]; [student studentInfo]; } return 0; } 

说明:::

  1. 当initWithStudent:学生将执行的主要方法

    1.1教师对象的属性“学生”将被分配给学生对象。

    1.2 self.student.delegate = self表示学生对象的委托将指向教师对象

  2. 从[学生studentInfo]被调用时的主要方法

    2.1 [self.delegate respondToSelector:@selector(teacherName)]这里委托已经指向教师对象,所以它可以调用'teacherName'实例方法。

    2.2 so [self.delegate performSelector:@selector(teacherName)]将很容易执行。

它看起来像老师对象分配代表学生对象调用它自己的方法。

这是一个相对的概念,我们看到学生对象叫做“teacherName”方法,但是它基本上是由老师对象本身来完成的。

试想一下,你打电话,然后点一份披萨。 然后,一个比萨饼送货员到达你的家(这是一个代表),当你为比萨买单时,送货的比萨饼男孩把钱还给他的餐厅。

你=对象传递男孩=代表餐厅=对象