写iOS时碰到的unrecognized selector sent to instance报错

之前跟心动网络对接台湾版本,接了他们的“天下网游”SDK,有段这样的代码。

1
2
3
4
5
6
7
8
9
10
11
12
+ (void) callTXWYPay:(NSDictionary *)dict
{
txwyPaySucc = [dict[@"onSucc"] intValue];
txwyPayFail = [dict[@"onFail"] intValue];
txwyPayCancel = [dict[@"onCancel"] intValue];

int level = [dict[@"userLevel"] intValue];
NSString *productId = [dict[@"productId"] stringValue];
NSString *orderKey = [dict[@"orderKey"] stringValue];

[SDKTxwyPassport payWithProductID:productId quantity:1 svrId:@"1" mark:orderKey level:level];
}

在我的手机上运行无误,在对方手机上出现无法调起SDK的情况,定位了一下,发现是没有走到

1
[SDKTxwyPassport payWithProductID:productId quantity:1 svrId:@"1" mark:orderKey level:level];

而且有个报错是

1
-[NSTaggedPointerString stringValue]: unrecognized selector sent to instance 0xa00303668616f6e6

对方跟我说,可能是dict里某个值是空的,我查看了下lua层面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
local NULL = function ()end
local args = {}

-- callbacks
args.onSucc = function ()
self:updateTip(Text:getStr("Pay_zhifucheng"))
self:removeTip()
end or NULL
args.onFail = function ()
self:updateTip(Text:getStr("pay_error"))
self:removeTip()
end or NULL
args.onCancel = function ()
self:updateTip(Text:getStr("Pay_zhifushibai"))
self:removeTip()
end or NULL

-- args
args.userLevel = tonumber(game.playerData.playerLevel) or 0
args.productId = tostring(productID) or ""
args.orderKey = tostring(orderKey) or ""

luaoc.callStaticMethod("AppController", "callTXWYPay", args)

我觉得我写的已经够安全了……于是死活想不通为啥还是调不起。

实际原因

于是我再询问了一下专门写oc的朋友,他跟我说,这个报错其实是某个对象没有stringValue的方法,应该是我强转的原因
于是我恍然大悟,我既然已经在lua层面tostring过了,在oc就可以直接使用这个值了。
于是改成下面形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+ (void) callTXWYPay:(NSDictionary *)dict
{
NSLog(@"callTXWYPay");
NSLog(@"dict:%@", dict);

txwyPaySucc = [dict[@"onSucc"] intValue];
txwyPayFail = [dict[@"onFail"] intValue];
txwyPayCancel = [dict[@"onCancel"] intValue];

int level = [dict[@"userLevel"] intValue];

NSLog(@"准备开始调起SDK productId: %@, orderKey: %@, level: %d",dict[@"productId"],dict[@"orderKey"],level);

[SDKTxwyPassport payWithProductID:dict[@"productId"] quantity:1 svrId:@"1" mark:dict[@"orderKey"] level:level];
NSLog(@"call sdk end");
}

正常调起SDK,并打印出”call sdk end”,问题解决。
另外,dict是可以通过NSLog直接打出来的!

文章目录
  1. 1. 实际原因
|