代表如何在Objective-C中工作?
- 有没有人知道我在哪里可以find一个很好的解释/教程什么和应用程序委托如何在
objective-C
? - 我所拥有的这两本书并没有充分详细地介绍给
delegates
,也没有很好地解释它们,让我真正理解它们的力量和function。
如有疑问,请查看文档 !
基本上,委托是允许对象彼此交互而不会在它们之间创build强相互依赖关系的一种方式,因为这会使应用程序的devise变得更加灵活。 他们可以有一个委托他们发送(或委托)消息给委托,而不是委托他们做,他们做的任何事情,以便对这个消息作出反应和行动,然后通常返回的东西回到另一个对象。
授权也是子类化的更好select。 代替你不得不创build自己的自定义类来稍微改变其他对象的行为方式,或者传递它们的数据,委托允许对象发送消息给自己的委托来为他们工作,而不需要创build子类来进行小的修改其他对象。
当然,委托的主要缺点是,可用的委托方法取决于苹果工程师预见的有用的东西,以及他们期望人们需要的常见实现方式,这些实现方式限制了您可以实现的目标。 尽pipeQuinn Taylor指出,这是Cocoa框架特有的,所以不适用于所有情况。
如果委托是子类化的一个选项,那就把它拿来,因为它是一种更简洁的方式来pipe理你的代码和对象之间的交互。
如上所述,委托并不是iOS或Objective-C的特征,只是一种编程技术,不需要特定的语言支持。
一个类(e,g,classA)可以这样写,使得它的getData和doSomething方法可以不是由它自己来实现,而是由一个委托来实现(也许因为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; }
说明:::
-
当initWithStudent:学生将执行的主要方法
1.1教师对象的属性“学生”将被分配给学生对象。
1.2 self.student.delegate = self表示学生对象的委托将指向教师对象
-
从[学生studentInfo]被调用时的主要方法
2.1 [self.delegate respondToSelector:@selector(teacherName)]这里委托已经指向教师对象,所以它可以调用'teacherName'实例方法。
2.2 so [self.delegate performSelector:@selector(teacherName)]将很容易执行。
它看起来像老师对象分配代表学生对象调用它自己的方法。
这是一个相对的概念,我们看到学生对象叫做“teacherName”方法,但是它基本上是由老师对象本身来完成的。
试想一下,你打电话,然后点一份披萨。 然后,一个比萨饼送货员到达你的家(这是一个代表),当你为比萨买单时,送货的比萨饼男孩把钱还给他的餐厅。
你=对象传递男孩=代表餐厅=对象