【问题标题】:Cast of 'long' to 'id' is disallowed with ARC - iOS DevARC 不允许将 'long' 转换为 'id' - iOS Dev
【发布时间】:2018-07-18 03:49:44
【问题描述】:

将我的项目转换为 ARC,但在上传和下载文件时需要这两段代码的帮助:

- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
[delegate performSelector:progressSelector withObject:(id)(100*totalBytesWritten /totalBytesExpectedToWrite)];

然后是下面的代码,特别是最后一行:

- (void)connection:(NSURLConnection *)con // IN
didReceiveData:(NSData *)data                // IN
{
NSLog(@"%s: self:0x%p\n", __func__, self);
NSInteger       dataLength;
const uint8_t * dataBytes;
NSInteger       bytesWritten;
NSInteger       bytesWrittenSoFar;

dataLength = data.length;
dataBytes  = (const uint8_t * )data.bytes;

bytesWrittenSoFar = 0;
if(fileStream!=NULL)
{
do {
    NSLog(@"%d",(int)bytesWrittenSoFar);
    bytesWritten = [fileStream write:&dataBytes[bytesWrittenSoFar] maxLength:dataLength - bytesWrittenSoFar];
    assert(bytesWritten != 0);
    if (bytesWritten == -1)
    {
         [self downloadSucceeded:NO];
        break;
    }
    else
    {
        bytesWrittenSoFar += bytesWritten;
    }
}
    while (bytesWrittenSoFar != dataLength);
}
dataSize+=data.length;
if(dataSize==downloadSize)
{
    downloadDidSucceed=TRUE;
}
[delegate performSelector:progressSelector withObject:(id)(long)(100*dataSize/downloadSize)];
}

感谢任何帮助

【问题讨论】:

  • 欢迎来到 Stack Overflow!您能否详细说明您的代码如何“不起作用”?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行和异常/错误详细信息。请edit这些详细信息,否则我们可能无法提供帮助。

标签: ios objective-c memory-management


【解决方案1】:

你的问题来了

 [delegate performSelector:progressSelector withObject:(id)(long)(100*dataSize/downloadSize)];

试试这个

[delegate performSelector:progressSelector withObject:[NSnumber numberWithLong:(100*dataSize/downloadSize)]];

【讨论】:

  • 更好的解决方案 - 不要使用performSelector:withObject:。没有理由在这里使用它。
  • 我会用什么代替?
【解决方案2】:

在 Objective-C 中,标量值(如 int/long/float/double)和对象类型之间存在区别。

id 类型是匿名对象类型。你不知道它是什么,但你知道它是一个对象。

long 不是,也不能是一个对象。它是一个简单的标量值。这就是编译器不允许您将 long 转换为 ID 类型的原因。

Sh_Khan 将您的 long 值包装在 NSNumber 中的答案通过创建一个包含您的值的对象来解决问题。您也可以使用NSValue 来获得相同的效果,但NSValue 可以表示您无法用NSNumbers 表示的结构之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多