Objective-C - Программа получила сигнал: «EXC_BAD_ACCESS». с (NSNumber floatValue) - PullRequest
2 голосов
/ 13 декабря 2010

Я получаю Program received signal: “EXC_BAD_ACCESS”. при использовании следующего кода.

searchResultFileSize объявлено как NSNumber в моем интерфейсе. Я не был уверен, какое свойство установить. В настоящее время у меня это как:

@property (nonatomic, readonly) NSNumber *searchResultFileSize;

Это правильно? Я получаю ошибки в следующих строках:

NSLog(@"float filesize: %f", [searchResultFileSize floatValue]); //Program received signal:  “EXC_BAD_ACCESS”.
HUD.progress = [resourceLength floatValue] / [searchResultFileSize floatValue]; //Program received signal:  “EXC_BAD_ACCESS”.

Если я закомментирую первую строку, она все равно явно не справится со второй. Есть идеи, в чем может быть проблема? Возможно, мои обращения неверны. Вот два метода, где я использую этот кусок кода:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];

    searchResultFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]];

    NSLog(@"Float filesize: %f", searchResultFileSize);

    if ([searchResultFileSize intValue] != NSURLResponseUnknownLength) {
        HUD.mode = MBProgressHUDModeDeterminate;
        HUD.labelText = @"Getting Results";
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];

    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[responseData length]];
    NSLog(@"resourceData length: %d", [resourceLength intValue]);
    NSLog(@"filesize: %d", searchResultFileSize);
    NSLog(@"float filesize: %f", [searchResultFileSize floatValue]); //Program received signal:  “EXC_BAD_ACCESS”.
    // HUD.progress is a float
    HUD.progress = [resourceLength floatValue] / [searchResultFileSize floatValue]; //Program received signal:  “EXC_BAD_ACCESS”.
    NSLog(@"progress: %f", [resourceLength floatValue] / [searchResultFileSize floatValue]);
}

1 Ответ

4 голосов
/ 13 декабря 2010

Ваша проблема здесь:

searchResultFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]];

Вам нужно retain, чтобы сохранить его, он автоматически выпущен.

searchResultFileSize = [[NSNumber numberWithLongLong:[response expectedContentLength]] retain];

Я бы предложил установить вашу собственность как (nonatomic, retain), тогда вам не нужно будет retain в своем коде.Кроме того, вы должны использовать установщики свойств (self.searchResultFileSize = x;), а не прямое назначение.Затем вы вызываете release в -dealloc.

Кроме того,

NSLog(@"Float filesize: %f", searchResultFileSize);

searchResultFileSize является объектом NSNumber, вы можете вывести значение NSNumberиспользуя спецификатор формата %@:

NSLog(@"Float filesize: %@", searchResultFileSize);
...