Странная ошибка - может получить доступ к методу описания NSURLConnection & NSMutableData, но не к их иварам - PullRequest
0 голосов
/ 27 июля 2011

поэтому я получил класс:
DataFetcher.h

#import <Foundation/Foundation.h>

@interface DataFetcher : NSObject 
{
    NSURLConnection *networkConnection;
    NSMutableData *recievedData;
    BOOL isFetchingFinished;
}

@property (nonatomic, retain) NSMutableData *recievedData;
@property (nonatomic, retain) NSURLConnection *networkConnection;

- (void)fetchDataWithRequest:(NSMutableURLRequest *)request;

DataFetcher.m:

#import "DataFetcher.h"

@implementation DataFetcher

@synthesize recievedData;
@synthesize networkConnection;

- (id)init
{
    self = [super init];
    if (self) {
        NSMutableData *data = [[NSMutableData alloc] initWithLength:0];
        self.recievedData = data;
        [data release];
    }

    return self;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"Connection Error:%@\n Failure Reason:%@", [error localizedDescription], [error localizedFailureReason]);
    [networkConnection release];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.recievedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [networkConnection release];
    NSLog(@"%@", self.recievedData.length);
    [self processData];
}

- (void)fetchDataWithRequest:(NSMutableURLRequest *)request
{
    NSURLConnection *aConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    self.networkConnection = aConnection;
    [aConnection release];
    [self.networkConnection start];
    if( !self.networkConnection )
    {
        NSLog(@"Connection failed! recieved nil at alloc point");
    }
}

- (void)dealloc
{
    [super dealloc];
    [recievedData release];
}

@end



Обычно происходит сбой из-за EXC_BAD_ACCESS (NSZombie ничего не обнаружит).Я заметил, что если вы включите connectionDidFinishLoading self.recievedData.length на self.recievedData, это не приведет к сбою и похоже, что там есть какие-то данные.то же самое, что я получаю для self.networkConnection - если я просто напечатаю self.networkConnection, все в порядке, но если я напечатаю self.networkConnection.retainCount (например, любой ивар будет работать), он потерпит крах с тем же сигналом.

Кажется, я не могу понять, в чем проблема, и я некоторое время искал ее, и я буду признателен за помощь:)
Tnx!

О, и я звоню с этим кодом:
DataFetcher *fetcher = [[DataFetcher alloc] init];<br> NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [fetcher fetchDataWithRequest:request]; [fetcher release]; [request release];

1 Ответ

0 голосов
/ 27 июля 2011
NSLog(@"%@", self.recievedData.length);

Здесь спецификатор формата% @ означает, что вы собираетесь регистрировать объект target-c, в то время как вы фактически передаете ему простое целое число - что приводит к сбою приложения. Измените ваш журнал на

 NSLog(@"%d", self.recievedData.length); 
...