使用ARC - iOS Dev

时间:2018-02-07 18:26:11

标签: ios objective-c memory-management

将我的项目转换为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)];
}

感谢任何帮助

2 个答案:

答案 0 :(得分:2)

你的问题在这里

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

试试这个

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

答案 1 :(得分:0)

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

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

long不是,也不可能是对象。这是一个简单的标量值。这就是为什么编译器不允许你将你的长期转换为ID类型。

Sh_Khan通过创建一个包含您的值的对象来解决问题,以解决问题。您也可以使用NSNumber来获得相同的效果,但NSValue可以表示您无法用NSValue表示的结构。