目标C iPhone开发中的“委托”是什么?

目标C iPhone开发中的“委托”是什么?

看到这个讨论

一个委托允许一个对象在发生事件时将消息发送给另一个对象。 例如,如果您使用NSURLConnection类asynchronous下载网站的数据。 NSURLConnection有三个常见的代表:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error - (void)connectionDidFinishLoading:(NSURLConnection *)connection - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

当NSURLConnection遇到失败,成功完成或从网站收到响应时,这些委托中的一个或多个将分别被调用。

一个委托是一个指向一个对象的指针,这个对象拥有一组代理知道如何调用的方法。 换句话说,这是一种启用后来创build的对象的特定callback的机制

一个很好的例子是UIAlertView 。 您创build一个UIAlertView对象来向用户显示一个短消息框,可能会给他们两个button(如“确定”和“取消”)的select。 UIAlertView需要一种方法来回叫,但它没有关于哪个对象要回叫的信息以及要调用的方法。

为了解决这个问题,你可以把self指针作为一个委托对象发送给UIAlertView作为交换,你同意(通过在你的对象的头文件中声明UIAlertViewDelegate )来实现一些UIAlertView可以调用的方法,比如alertView:clickedButtonAtIndex:

查看这篇文章 , 了解委托devise模式和其他callback技术的快速高级介绍

参考文献:

  • UIAlertView类的参考
  • UIAlertViewDelegate类的参考
  • 苹果对代表和数据源的指南

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

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

我认为这篇维基百科文章最好地描述了它: http : //en.wikipedia.org/wiki/Delegation_pattern

这只是一个devise模式的实现,在Objective-C中很常见

请! 请查看下面的简单的一步一步的教程,以了解Delegates如何在iOS中工作。

在iOS中委派

我创build了两个ViewController(用于将数据从一个发送到另一个)

  1. FirstViewController实现委托(提供数据)。
  2. SecondViewController声明委托(将接收数据)。

这里是示例代码可能会帮助你。

AppDelegate.h


 #import <UIKit/UIKit.h> @class FirstViewController; @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) FirstViewController *firstViewController; @end 

AppDelegate.m


 #import "AppDelegate.h" #import "FirstViewController.h" @implementation AppDelegate @synthesize firstViewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. //create instance of FirstViewController firstViewController = [[FirstViewController alloc] init]; //create UINavigationController instance using firstViewController UINavigationController *firstView = [[UINavigationController alloc] initWithRootViewController:firstViewController]; //added navigation controller to window as a rootViewController self.window.rootViewController = firstView; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end 

FirstViewController.h


 #import <UIKit/UIKit.h> #import "SecondViewController.h" @interface FirstViewController : UIViewController<MyDelegate> @property (nonatomic, retain) NSString *mesasgeData; @property (weak, nonatomic) IBOutlet UITextField *textField; @property (weak, nonatomic) IBOutlet UIButton *nextButton; - (IBAction)buttonPressed:(id)sender; @property (nonatomic, strong) SecondViewController *secondViewController; @end 

FirstViewController.m


 #import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController @synthesize mesasgeData; @synthesize textField; @synthesize secondViewController; #pragma mark - View Controller's Life Cycle methods - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } #pragma mark - Button Click event handling method - (IBAction)buttonPressed:(id)sender { //get the input data from text feild and store into string mesasgeData = textField.text; //go keypad back when button clicked from textfield [textField resignFirstResponder]; //crating instance of second view controller secondViewController = [[SecondViewController alloc]init]; //it says SecondViewController is implementing MyDelegate secondViewController.myDelegate = self; //loading new view via navigation controller [self.navigationController pushViewController:secondViewController animated:YES]; } #pragma mark - MyDelegate's method implementation -(NSString *) getMessageString{ return mesasgeData; } @end 

SecondViewController.h


 //declare our own delegate @protocol MyDelegate <NSObject> -(NSString *) getMessageString; @end #import <UIKit/UIKit.h> @interface SecondViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *messageLabel; @property (nonatomic, retain) id <MyDelegate> myDelegate; @end 

SecondViewController.m


 #import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController @synthesize messageLabel; @synthesize myDelegate; - (void)viewDidLoad { [super viewDidLoad]; messageLabel.text = [myDelegate getMessageString]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end 

请让我知道,如果你有这个麻烦,高兴地帮助!

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

两个类

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:student将执行的主要方法

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

    1.2 self.student.delegate = self

      means student object's delegate will points to teacher object 
  2. [student studentInfo]被调用时的主要方法

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

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

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

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

我认为,一旦你了解了代表,所有这些答案都很有意义。 就我个人而言,我来自C / C ++的领域,在像Fortran等程序语言之前,这里是我在C ++范式中find类似的类似物的2分钟。

如果我要向C ++ / Java程序员解释代表,我会说

什么是代表? 这些是静态指向另一个类中的类的指针。 一旦你分配了一个指针,你可以调用该类中的函数/方法。 因此,你的类的一些function是“委托”(在C ++世界 – 指向类对象指针的指针)到另一个类。

什么是协议? 从概念上来说,它与作为委托类分配的类的头文件类似。 一个协议是一个明确的方式来定义什么样的方法需要实现的类的指针被设置为一个类中的委托。

我如何在C ++中做类似的事情? 如果你试图用C ++来做到这一点,你可以在类定义中定义指向类(对象)的指针,然后将它们连接到其他类,这些类将提供作为委托给你的基类的附加function。 但是这种布线需要在代码中进行,而且会很笨拙,容易出错。 Objective C只是假设程序员不是最好的维护这个分界线,并提供编译器的限制来执行一个干净的实现。

委托触发对象C中的自动事件。如果将委托设置为对象,则它将通过委托方法将消息发送给另一个对象。

这是修改一个类的行为而不需要子类化的一种方法。

每个对象都具有委托方法。当特定的对象参与用户交互和程序stream程循环时,这些委托方法触发。

简单地说:委托是允许对象彼此交互而不在它们之间build立强相互依赖关系的一种方式。

代表捕获用户的录像动作,并根据用户录音动作执行特定的动作。

委托只不过是Object的一个实例,我们可以调用这个Object的方法。 也有助于在该对象的朗姆酒时间创build方法。