Проблема с использованием пользовательского класса NSObject для упрощения повторяющегося кода в приложении iPhone - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь сохранить модель соединения REST в одном объекте, чтобы мне не приходилось использовать ее снова и снова. Вот модель, которую я создал:

//RestModel.h
#import "ASIHTTPRequest.h"

@interface RestModel : NSObject{
    NSString* _baseUrl;
    NSString* _modelUrl;
}

@property (nonatomic, retain) NSString* modelUrl;

- (id)initWithModel:(NSString*)model;
- (NSDictionary*)getById:(NSInteger*)ident;
- (NSDictionary*)getAll;

@end

//RestModel.m
#import "RestModel.h"

@implementation RestModel

@synthesize modelUrl = _modelUrl;

- (id)init
{
    self = [super init];
    if (self) {
        _baseUrl = @"http://myRESTurl.com";
    }

    return self;
}

- (id)initWithModel:(NSString*)model
{
    self = [super init];
    if (self) {
        _baseUrl = @"http://myRESTurl.com";
        self.modelUrl = [NSString stringWithFormat:@"%@/%@/", _baseUrl, model];
    }

    return self;
}

- (NSDictionary*)HTTPRequest:(NSURL*)url
{
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];
    if(!error){
        NSData *responseData = [request responseData];
        NSString *errorDesc = nil;
        NSPropertyListFormat format;

        [error release]; 
        [request release];

        return (NSDictionary*)[NSPropertyListSerialization propertyListFromData:responseData mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    }else{
        NSLog(@"%@", error);
        return nil;
    }
}

- (NSDictionary*)getById:(NSInteger*)ident
{
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", self.modelUrl, ident]];
    return [self HTTPRequest:url];
}

- (NSDictionary*)getAll
{
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", self.modelUrl]];
    return [self HTTPRequest:url];
}

- (void)dealloc
{
    [_modelUrl release];
//    [_responseData release];
//    [_responseDict release];
    [super dealloc];
}

@end

Edit: теперь это не сбой, но мой локальный NSDictionary имеет счетчик 0. Я вызываю следующее в -viewDidLoad в моем контроллере:

RestModel* rm = [[RestModel alloc] initWithModel:@"user"];
self.dict = [rm getAll];
[rm release];

Я установил NSLog [self.dict count] по всему контроллеру. Это всегда 0. Вызывается RestModel rm, вызываются функции (опять же больше NSLogs), но нет данных. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011
    [error release]; 
    [request release];

Это должны быть автоматически высвобождаемые объекты, поскольку вы получили их с помощью удобных методов, поэтому их явное освобождение приведет к сбою приложения.

1 голос
/ 12 сентября 2011

NSInteger не является объектом, поэтому нет необходимости передавать его с помощью NSInteger *, и, конечно, вы не хотите использовать спецификатор формата% @. Вместо этого попробуйте это:

    - (NSDictionary*)getById:(NSInteger)ident
    {
        NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d", self.modelUrl, ident]];
        return [self HTTPRequest:url];
    }
...