Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 如果多次调用'NEPacketTunnelflow'方法'readPacketsWithCompletionHandler',会发生什么情况?_Ios_Objective C_Macos_Networkextension - Fatal编程技术网

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调用它

然而,没有文献记载的是:如果在调用之前的set
completionHandler
之前再次调用此方法,会发生什么

新的处理程序是否会替换先前的集合,而先前的集合将不再被调用

当数据到达时,处理程序是否都被调度和调用?如果是这样的话,它们会按照我传递给它们的顺序、相反的顺序还是随机的顺序被调用

有人对该方法是如何实现的有什么见解吗

当然,我可以制作一个演示项目,创建一个测试设置,并查看通过测试得到的结果,但这非常耗时,不一定可靠。未指明行为的问题在于,它可能会随意改变,而不会让任何人知道。这种方法在macOS和iOS上的表现可能不同,在每一个新的OS版本中,或者根据一周中的哪一天,它的表现可能不同


或者,没有任何文件记录的事实是有意的吗?我是否必须将其解释为:您可以调用此方法一次,在执行回调后,您可以使用相同或新的回调再次调用它。其他一切都是未定义的行为,如果以不同的方式使用该API,您不能也不应该依赖任何特定的行为。

由于到目前为止还没有人回复,我尽了最大努力自己解决。由于测试对我来说不够好,以下是我所做的:

首先,我使用从macOS Big Sur的dyld缓存中提取了
NetworkExtension
framework二进制文件

然后我在生成的二进制文件上运行
otool-Vt
,以获得二进制文件的反汇编转储

我的汇编技能有点生疏,但从我所看到的
completionHandler
存储在名为
packetHandler
的属性中,替换了以前存储的任何值。此外,在该方法中创建回调并存储在通过调用方法
接口
获得的对象上

查看此创建回调的代码时,它会获取
packetHandler
属性的值,并在获取值后将其设置为
NULL
。然后它创建
NSData
NSNumber
对象,将这些对象添加到
NSArray
对象中,并使用这些数组调用获得的处理程序

因此,再次调用该方法似乎只是替换了以前的
completionHandler
,以后将不再调用该方法