gpt4 book ai didi

ios - 马特加洛韦书 EOC : delegate ignore protocol method

转载 作者:行者123 更新时间:2023-11-29 02:47:31 26 4
gpt4 key购买 nike

Matt Galloway 书 EOC 的第 15 条,用一个例子来说明潜在的名称冲突,这是完全可以理解的。但我正在关注协议(protocol)方法的实现,它没有实现......并且没有来自编译器的错误/警告。

// EOCSoundPlayer.h file 
#import <Foundation/Foundation.h>

@class EOCSoundPlayer;
@protocol EOCSoundPlayerDelegate <NSObject>
- (void)soundPlayerDidFinish:(EOCSoundPlayer*)player;
@end

@interface EOCSoundPlayer : NSObject
@property (nonatomic, weak) id <EOCSoundPlayerDelegate> delegate;
- (id)initWithURL:(NSURL*)url;
- (void)playSound;
@end

// EOCSoundPlayer.m file
#import "EOCSoundPlayer.h"
#import <AudioToolbox/AudioToolbox.h>

void completion(SystemSoundID ssID, void *clientData) {
EOCSoundPlayer *player = (__bridge EOCSoundPlayer*)clientData;
if ([player.delegate respondsToSelector:@selector(soundPlayerDidFinish:)]) {
[player.delegate soundPlayerDidFinish:player];
}
}

@implementation EOCSoundPlayer {
SystemSoundID _systemSoundID;
}

- (id)initWithURL:(NSURL*)url {
if ((self = [super init])) {
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &_systemSoundID);
}
return self;
}

- (void)dealloc {
AudioServicesDisposeSystemSoundID(_systemSoundID);
}

- (void)playSound {
AudioServicesAddSystemSoundCompletion(
_systemSoundID,
NULL,
NULL,
completion,
(__bridge void*)self);
AudioServicesPlaySystemSound(_systemSoundID);
}

@end

为什么 .m 文件中没有协议(protocol)方法“soundPlayerDidFinish:”的实现?是否不需要在自定义代码中执行,如果是,默认实现是什么?是否必须在运行时实现?

最佳答案

声音播放器本身并不实现该协议(protocol),它有一个实现该协议(protocol)的委托(delegate)。毕竟,它是 EOCSoundPlayerDelegate 协议(protocol)。

拥有一个符合自定义协议(protocol)(如该示例中所示)的委托(delegate)是非常好的。它导致了一个很好的松散耦合。声音播放器仅打算在其委托(delegate)上调用某些方法(在本例中只有一个方法),因此委托(delegate)实现这些方法(在本例中为该方法)才重要。

您还将看到声音播放器在调用委托(delegate)上的方法之前检查委托(delegate)是否也响应该方法。

关于ios - 马特加洛韦书 EOC : delegate ignore protocol method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com