Objective c invokeSelector:withObject:在版本中崩溃
我有密码Objective c invokeSelector:withObject:在版本中崩溃,objective-c,ios,Objective C,Ios,我有密码 [target invokeSelector:handler.successAction with object:object]; 它可能会调用一些方法。不管有无目标。它在调试时工作正常,但在发布时崩溃: Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> selector: successfulLogin Nov 20 21:55:13 efpies project[7202] <War
[target invokeSelector:handler.successAction with object:object];
它可能会调用一些方法。不管有无目标。它在调试时工作正常,但在发布时崩溃:
Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> selector: successfulLogin
Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> target: <AppDelegate: 0x1f595a90>
Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> object: <7b226d65 73736167 65223a22 5c753034 31325c75 30343435 5c753034 33655c75 30343334 205c7530 3434305c 75303433 305c7530 3433375c 75303434 305c7530 3433355c 75303434 385c7530 3433355c 75303433 64227d> NSConcreteMutableData
Nov 20 21:55:13 efpies project[7202] <Error>: -[AppDelegate invokeSelector:withObject:]: unrecognized selector sent to instance 0x1f595a90
Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> selector: driversUpdated:
Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> target: <DriversList: 0x1cd5ffd0>
Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> object: (
) __NSArrayM
Nov 20 21:56:12 efpies project[7205] <Error>: -[DriversList invokeSelector:withObject:]: unrecognized selector sent to instance 0x1cd5ffd0
11月20日21:55:13 efpies项目[7202]:>>>>选择器:成功登录
11月20日21:55:13 efpies项目[7202]:>>>>目标:
11月20日21:55:13 efpies项目[7202]:>>>>>对象:NSConcreteTableData
11月20日21:55:13 efpies项目[7202]:-[AppDelegate invokeSelector:withObject:]:发送到实例0x1f595a90的选择器无法识别
11月20日21:56:12 efpies项目[7205]:>>>>选择器:驱动器更新:
11月20日21:56:12 efpies项目[7205]:>>>>目标:
11月20日21:56:12 efpies项目[7205]:>>>>对象:(
)_uunsarraym
11月20日21:56:12 efpies项目[7205]:-[DriversList invokeSelector:withObject:]:发送到实例0x1cd5ffd0的选择器无法识别
这些方法是可用的(甚至可以在头文件中显示)。发生了什么?数据和对象100%正确使用
[target performSelector:handler.successAction withObject:object];
这是在cocoa touch中执行此操作的方法,因为NSObject
将为您处理此操作。
查看更多详细信息。事实证明,
调用选择器:withObject:
是静态库中的一个类别方法。静态库中的类别不会自动加载,因此您应该编写
-force\u load$(BUILD\u ROOT)/$(CONFIGURATION)$(EFFECTIVE\u PLATFORM\u NAME)/lib\u NAME.a
如果编译为目标的依赖项,则指向目标的
生成设置中的其他链接器标志
字段。使用[target performSelector:handler.successAction];这是在cocoa touch中执行此操作的方法,因为NSObject将为您处理此操作。检查:@ACB:我非常确定handler.successAction
可能已经是SEL
,因此正确的调用应该是[target performSelector:handler.successAction withObject:object]
@Tim,谢谢您的更正。更改了它。@efpies:Where是-invokeSelector:withObject:
定义的?我没有在NSObject上看到它;通常,想要做您正在做的事情的人将使用类似名称的方法-performSelector:withObject:
。但是,当NSObject协议已经提供了performSelector时,为什么要使用此分类方法呢?它有什么帮助?@ACBperformSelector
可以对可能的泄漏发出警告。例如,您为类型为id
的对象调用performSelector
。因为编译器不知道是否有这样的选择器(编译时类型未知)。为了让它闭嘴,而不是在每个地方都写pragma
s,包装器已经编写好了。它只是用#pragma-clang-diagnostic-push
-#pragma-clang-diagnostic-pop
包装performSelector
,并且里面有一条指令:#pragma-clang-diagnostic-ignored“-Warc-performSelector-leaks”
。但现在我们应该确保在随机对象中调用适当的选择器。