Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 学员如何在objective-C中工作? 有人知道我在哪里可以找到关于应用程序委托在objective-C中的工作内容和工作方式的好解释/教程吗 我所拥有的两本书对委托人的关注不够,也没有很好地解释它们,使我无法真正理解它们的力量和功能_Ios_Objective C_Delegates - Fatal编程技术网

Ios 学员如何在objective-C中工作? 有人知道我在哪里可以找到关于应用程序委托在objective-C中的工作内容和工作方式的好解释/教程吗 我所拥有的两本书对委托人的关注不够,也没有很好地解释它们,使我无法真正理解它们的力量和功能

Ios 学员如何在objective-C中工作? 有人知道我在哪里可以找到关于应用程序委托在objective-C中的工作内容和工作方式的好解释/教程吗 我所拥有的两本书对委托人的关注不够,也没有很好地解释它们,使我无法真正理解它们的力量和功能,ios,objective-c,delegates,Ios,Objective C,Delegates,如有疑问,请检查 基本上,委托是一种允许对象相互交互的方式,而不会在它们之间创建强烈的相互依赖关系,因为这会降低应用程序的设计灵活性。对象之间不需要相互控制,它们可以有一个委托,向该委托发送(或委托)消息,委托可以执行任何操作,以响应和执行该消息,然后通常将某些内容返回给另一个对象 委托也是子类化的更好选择。您不必创建自己的自定义类来稍微改变其他对象的行为方式或向其传递数据,委托允许对象向其委托发送消息以为其执行工作,而无需创建子类来对其他对象进行微小更改 当然,委托的主要缺点是,可用的委托方法

如有疑问,请检查

基本上,委托是一种允许对象相互交互的方式,而不会在它们之间创建强烈的相互依赖关系,因为这会降低应用程序的设计灵活性。对象之间不需要相互控制,它们可以有一个委托,向该委托发送(或委托)消息,委托可以执行任何操作,以响应和执行该消息,然后通常将某些内容返回给另一个对象

委托也是子类化的更好选择。您不必创建自己的自定义类来稍微改变其他对象的行为方式或向其传递数据,委托允许对象向其委托发送消息以为其执行工作,而无需创建子类来对其他对象进行微小更改

当然,委托的主要缺点是,可用的委托方法取决于苹果工程师所预见的有用内容,以及他们期望人们需要的常见实现,这就限制了您所能实现的功能。虽然,正如Quinn Taylor指出的,这是Cocoa框架特有的,因此并不适用于所有情况


如果委托是子类化的一种选择,那么就接受它,因为它是管理代码和对象之间交互的一种更干净的方法。

委托是一种设计模式;没有特殊的语法或语言支持


委托只是一个对象,当某些事情发生时,另一个对象会向其发送消息,以便委托可以处理原始对象未设计的特定于应用程序的详细信息。这是一种无需子类化即可自定义行为的方法。

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

类(例如,classA)的编写方式可以使其getData和doSomething方法不是由自身实现的,而是由委托实现的(可能是因为classA不知道数据将是什么或必须做什么)

为了实现这一点,classA提供了一个属性,通常称为delegate(它只是指向实现委托方法的类-委托-的指针),然后,当它想要调用这些方法时,它实际上调用委托中的方法:

[self.delegate getData];

self.delegate
最初可以设置为
self

self.delegate = self;
i、 classA实现这些方法的自己的版本,除非它们被委托

任何其他想要成为方法实现者的类(即成为委托并可能覆盖classA的默认实现)都会首先将classA的委托设置为自身。因此,如果classB想成为这些方法的委托,在classB中,我们将:

classA.delegate = self;
因此,当classA调用这些委托方法时,它实际上是调用classB来实现这些方法,而不知道classB的任何信息,甚至不知道它是否存在,classB不必子类classA

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


协议用于通过定义一系列方法使委托过程正式化,这些方法必须由委托人实施(委托人不提供默认版本的方法,该方法必须在某处实施),或者可以由委托人实施(也就是说,委托人有自己的版本,或者不管方法是否实现)。

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

两类

学生

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (weak) id  delegate;
- (void) studentInfo;
@end
老师

#import <Foundation/Foundation.h>
#import "Student.h>

@interface Teacher: NSObject
@property (strong,nonatomic) Student *student;
- (NSString *) teacherName;
- (id) initWithStudent:(Student *)student;
@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;
}
#导入
#导入“Teacher.h”
int main(int argc,const char*argv[]
{
@自动释放池{
学生*Student=[[Student alloc]init];
教师*Teacher=[[Teacher alloc]initWithStudent:student];
[学生资讯];
}
返回0;
}
说明:::

  • initWithStudent时从主方法:student将执行

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

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

  • 当调用[student studentInfo]时,从main方法开始

    2.1[self.delegate respondToSelector:@selector(teacherName)]此处已委托 指向教师对象,以便它可以调用“教师名称”实例方法

    2.2 so[自我委托执行选择器:@selector(教师姓名)] 将很容易执行

  • 看起来教师对象将委托分配给学生对象以调用其自己的方法


    这是一个相对的概念,我们看到学生对象被称为“teacherName”方法,但基本上是由教师对象本身完成的。

    想象一下,你打电话来,点了一份比萨饼。 然后,一个送比萨饼的男孩来到你家(这是一名代表),什么时候 你付了披萨的钱,送披萨的男孩把钱还给他的餐厅


    you=object delivery boy=Delegate restaurant=object

    谢谢……我在之前查看手册时,在手册页中找不到任何关于代表的信息。我猜我是在错误的部分。你不太可能在手册页中找到任何关于Objective-C的信息。苹果的在线文档是最终的来源,不仅是关于可可豆的详细信息,还有也是为了概念背景。@Quinn Taylor:是的,改变了它。我是在上下文中说的,虽然是的,但一般来说,当谈论授权时,它并不适用。你
    #import <Foundation/Foundation.h>
    #import "Student.h>
    
    @interface Teacher: NSObject
    @property (strong,nonatomic) Student *student;
    - (NSString *) teacherName;
    - (id) initWithStudent:(Student *)student;
    @end
    
    #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
    
    #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;
    }