Delphi iOS平台调用MultipeerConnectivity的invitationHandler触发访问违规问题求助
解决Delphi中调用MCNearbyServiceAdvertiserDelegate的invitationHandler时的AccessViolation问题
首先,你的核心问题在于误解了TMCNearbyServiceAdvertiserDelegateBlockMethod1的类型——它是Delphi的对象方法类型(带of object修饰),而不是Objective-C的block指针,所以完全不需要用imp_implementationWithBlock这类函数去转换,直接调用即可。
错误原因分析
你之前尝试用imp_implementationWithBlock处理invitationHandler,但这个函数是用来把Objective-C block包装成C函数指针的工具,而invitationHandler本身已经是Delphi可以直接调用的对象方法,强行转换自然会触发访问违规错误。
正确的调用方式
直接调用invitationHandler参数,传入对应的accept布尔值和你的MCSession实例即可,不需要额外的转换步骤。修改后的代码如下:
procedure TMCNearbyServiceAdvertiserDelegate.advertiser(advertiser: MCNearbyServiceAdvertiser; didReceiveInvitationFromPeer: MCPeerID; withContext: NSData; invitationHandler: TMCNearbyServiceAdvertiserDelegateBlockMethod1); var MainForm: TMainForm; begin MainForm := Application.MainForm as TMainForm; if MainForm.fSession = nil then begin MainForm.fSession := TMCSession.Alloc; MainForm.fSession.initWithPeer(MainForm.fPeerId); MainForm.fSessionDelegate := TMCSessionDelegate.Create; MainForm.fSession.setDelegate(MainForm.fSessionDelegate.GetObjectID); end; // 直接调用invitationHandler,无需任何转换操作 invitationHandler(True, MainForm.fSession); end;
额外注意事项
- 确保你的
MCSession实例和fPeerId都已经正确初始化,避免因空指针引发潜在问题。 - 如果需要拒绝邀请,只需要传入
False和nil作为参数即可:invitationHandler(False, nil);
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

