Ios 如果多次调用'NEPacketTunnelflow'方法'readPacketsWithCompletionHandler',会发生什么情况?
调用方法时Ios 如果多次调用'NEPacketTunnelflow'方法'readPacketsWithCompletionHandler',会发生什么情况?,ios,objective-c,macos,networkextension,Ios,Objective C,Macos,Networkextension,调用方法时 - (void)readPacketsWithCompletionHandler:(void (^)( NSArray<NSData *> *packets, NSArray<NSNumber *> *protocols))completionHandler; -(void)readPacketsWithCompletionHandler:(void(^)( NSArray*数据包,NSArray*协议)completionHandler; 如果数
- (void)readPacketsWithCompletionHandler:(void (^)(
NSArray<NSData *> *packets, NSArray<NSNumber *> *protocols))completionHandler;
-(void)readPacketsWithCompletionHandler:(void(^)(
NSArray*数据包,NSArray*协议)completionHandler;
如果数据包在调用时可用,则直接调用completionHandler
,或者在数据包可用时在稍后的tim调用它
然而,没有文献记载的是:如果在调用之前的setcompletionHandler
之前再次调用此方法,会发生什么
新的处理程序是否会替换先前的集合,而先前的集合将不再被调用
当数据到达时,处理程序是否都被调度和调用?如果是这样的话,它们会按照我传递给它们的顺序、相反的顺序还是随机的顺序被调用
有人对该方法是如何实现的有什么见解吗
当然,我可以制作一个演示项目,创建一个测试设置,并查看通过测试得到的结果,但这非常耗时,不一定可靠。未指明行为的问题在于,它可能会随意改变,而不会让任何人知道。这种方法在macOS和iOS上的表现可能不同,在每一个新的OS版本中,或者根据一周中的哪一天,它的表现可能不同
或者,没有任何文件记录的事实是有意的吗?我是否必须将其解释为:您可以调用此方法一次,在执行回调后,您可以使用相同或新的回调再次调用它。其他一切都是未定义的行为,如果以不同的方式使用该API,您不能也不应该依赖任何特定的行为。由于到目前为止还没有人回复,我尽了最大努力自己解决。由于测试对我来说不够好,以下是我所做的: 首先,我使用从macOS Big Sur的dyld缓存中提取了
NetworkExtension
framework二进制文件
然后我在生成的二进制文件上运行otool-Vt
,以获得二进制文件的反汇编转储
我的汇编技能有点生疏,但从我所看到的completionHandler
存储在名为packetHandler
的属性中,替换了以前存储的任何值。此外,在该方法中创建回调并存储在通过调用方法接口
获得的对象上
查看此创建回调的代码时,它会获取packetHandler
属性的值,并在获取值后将其设置为NULL
。然后它创建NSData
和NSNumber
对象,将这些对象添加到NSArray
对象中,并使用这些数组调用获得的处理程序
因此,再次调用该方法似乎只是替换了以前的completionHandler
,以后将不再调用该方法