我尝试通过简单的程序来阐述它
两个类
学生.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (weak) id delegate;
- (void) studentInfo;
@end
学生.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
老师.h
#import <Foundation/Foundation.h>
#import "Student.h>
@interface Teacher: NSObject
@property (strong,nonatomic) Student *student;
- (NSString *) teacherName;
- (id) initWithStudent:(Student *)student;
@end
老师.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:student 将执行时从 main 方法开始
1.1 教师对象的属性“学生”将被分配学生对象。
1.2 self.student.delegate = self
表示学生对象的委托将指向教师对象
-
调用 [student studentInfo] 时的 main 方法
2.1 [self.delegate respondToSelector:@selector(teacherName)] 这里已经委托
指向教师对象,因此它可以调用 'teacherName' 实例方法。
2.2 所以 [self.delegate performSelector:@selector(teacherName)]
将轻松执行。
看起来教师对象将委托分配给学生对象以调用它自己的方法。
这是一个相对的想法,我们看到学生对象称为“teacherName”方法,但它基本上是由教师对象本身完成的。