繁体   English   中英

ARC禁止将非目标C指针类型'const UInt8 *'(aka'const unsigned char *')强制转换为'NSData *'

[英]Cast of a non-Objective-C pointer type 'const UInt8 *' (aka 'const unsigned char *') to 'NSData *' is disallowed with ARC

好的,我对Obj-C和iOS完全陌生。 我只是在尝试一个iOS上的Pebble手表的DataLogging示例,并更改一些内容来记录加速度计读数。

我有这个功能:

- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 *const)data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)sessionMetadata{

    //NSString *log = [NSString stringWithFormat:@"%s", data]; <-- this line compiles but display garbage on the view. So I try to use the line below.

    NSString *log = [[NSString alloc] initWithData:(NSData *)data encoding:NSASCIIStringEncoding]; <-- this line gave build error as in the post title

    [self addLogLine:log];

    // We consumed the data, let the data logging service know:
    return YES;
}

因此,任何帮助将不胜感激。 谢谢。

首先是您的错误:它告诉您不能使用非Objective-C对象的指针-您有指向UInt8的指针-只需将其转换为指向Objective-C对象的指针-在您的情况下, NSData为ARC(Objective-C内存收集器)不知道如何处理结果。 如果可能的话,可以通过桥接强制转换来告诉ARC如何处理它。 但是,在您的情况下,这是不可能的,因为您不能仅将UInt8 *转换为NSData * -两者所指的是完全不同的事物。

可能会为您的方法传递一个指针,该指针指向字节序列( hasByteArrays:和序列中的字节数( numberOfItems ),如果正确,则您要使用的方法是initWithBytes:length:encoding:此方法直接采用指向字节序列的指针。 例如:

NSString *log = [[NSString alloc] initWithBytes:data
                                         length:numberOfItems
                                       encoding:NSASCIIStringEncoding];

请尝试以下方法:

- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 *const)data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)sessionMetadata{

     NSString *log = [NSString stringWithCString:(const char *)data encoding:NSUTF8StringEncoding];

    [self addLogLine:log];

    // We consumed the data, let the data logging service know:
    return YES;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM