繁体   English   中英

一个Objective-C协议的问题

[英]A question of objective-C protocol

我尝试学习目标C的协议。
我写了两个文件,第一个是FirstViewController.h,其中有一个协议“ print”。 我使用委托方法“ print”在successViewController中声明FirstViewController类。 问题是为什么控制台输出为“ C”。 为什么我无法获得“ B”输出? 为什么协议方法没有执行?

#import <UIKit/UIKit.h>
#import "FirstViewController.h"
@interface successViewController : UIViewController <FirstViewControllerDelegate> {
}
@end

#import "successViewController.h"
#import "FirstViewController.h"
@implementation successViewController
- (void)viewDidLoad {
FirstViewController *firstViewController= [[FirstViewController alloc] init];
firstViewController.delegate=self;
NSLog(@"C");
 [super viewDidLoad];
}
 -(void) print{
 NSLog(@"B");
 }
@end

#import <Foundation/Foundation.h>
@class FirstViewController;
@protocol FirstViewControllerDelegate <NSObject>
- (void) print;
@end
@interface FirstViewController : NSObject {
id <FirstViewControllerDelegate> delegate;

}
@property (nonatomic, assign) id <FirstViewControllerDelegate> delegate;
@end

#import "FirstViewController.h"
@implementation FirstViewController
@synthesize delegate;
@end

因为您永远不会调用print方法。 您希望在哪里调用它?

使用Objective-C协议,您可以指定类能够执行某些操作。 在您的示例中, successViewController被声明为FirstViewControllerDelegate ,这意味着它能够处理其委托FirstViewController所需的职责。 它更多是类之间的编程契约,可以由编译器验证。

附带说明一下,Objective-C中的类应始终以大写字母开头,方法应始终以小写字母开头。 您的FirstViewController遵循此规则,但successViewController不遵循此规则。

您需要调用要使用的方法。

[successViewController print];

您永远不会调用委托print方法。 代表看不清您的想法,无法自动调用内容。 让我们举一个小例子来说明委托的工作方式。

假设我们有一个名为Delay的类,它唯一要做的就是等待调用start的时间,然后告诉它它已经等待了委托。 可选地,委托人可以告诉Delay等待多长时间,如果客户端不在乎,则假定延迟为1秒。

一些规则:

  1. 所有委托方法的第一个参数应该是发送者本身,永远不要有没有参数的委托方法。
  2. 委托方法名称应包含以下单词之一:
    1. will -如果在不可避免的事情发生之前调用了方法。 示例application Will Terminate:
    2. did -如果在发生某事后调用了方法。 示例scrollView Did Scroll:
    3. should -如果该方法返回BOOL以发出信号,指示是否应该发生某种情况。 示例textField Should Clear:
  3. 命名方法以告知发生了什么,而不是您希望委托执行的操作。
    1. 唯一的例外是,如果希望客户端返回某些内容,则该内容应该是名称的一部分。 示例: tableView: editingStyle ForRowAtIndexPath:

这是简单的定义和实现。 请注意,我什至不检查是否已设置了委托,因为无论如何,对nil调用方法都将被忽略。

// Delay.h
@protocol DelayDelegate;

@interface Delay : NSObject {
@private
  id<DelayDelegate> _delegate;
}
@property(nonatomic, assign) id<DelayDelegate> delegate;
-(void)start;
@end

@protocol DelayDelegate <NSObject>
@required
-(void)delayDidComplete:(Delay*)delay;
@optional
-(NSTimeInterval)timeIntervalForDelay:(Delay*)delay;
@end


// Delay.m
@interface Delay
@synthesize = delegate = _delegate;

-(void)start {
   NSTimeInterval delay = 1.0;
   if ([self.delegate respondsToSelector:@selector(timeIntervalForDelay:)]) {
     delay = [self.delegate timeIntervalForDelay:self];
   }
   [self performSelector:@selector(fireDelay) withObject:nil afterDelay:delay];
}

-(void)fireDelay {
  [self.delegate delayDidComplete:self];
}
@end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM