簡體   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