Objective-C:添加后没有数组中的对象。超出范围!

时间:2011-11-18 11:21:22

标签: objective-c arrays scope

我在对象中有一个NSMutableArray。 在对象方法中,我做了类似这样的事情:

/* ... */
[[LRResty client] get:connectURL withBlock:^(LRRestyResponse *r) {
    SBJsonParser *jsonParser = [SBJsonParser new];
    NSDictionary *jsonResponse = [jsonParser objectWithString:[r asString]];
    NSDictionary *permittedBases= [jsonResponse objectForKey:@"permittedBases"];
    Database *database = [[Database alloc] init];

    for (id key in permittedBases) {
        /* ... */
        [workingDatabases addObject:database];
    }
}];

return workingDatabases;    

在返回行,我的数组中没有对象(不再)。我知道“数据库”对象超出范围这一事实。但是我将它们保存在数组中。

我在监督什么吗?

如果有任何帮助,这里是头文件:

@class Database;

@interface CommunicationHelper : NSObject {
    NSMutableArray *workingDatabases;
}


// The function where the problem appears:
- (NSMutableArray *)getDatabasesForWebsite:(Website *)websiteIn; 

@property(nonatomic,copy) NSMutableArray *workingDatabases;


@end

3 个答案:

答案 0 :(得分:1)

我认为这是因为[LRResty client] get:是异步的。在连接完成时,即在返回调用之后调用该块。

//Called first
[[LRResty client] get:connectURL

//Called second
return workingDatabases;

//Called later when the connection is finished
SBJsonParser *jsonParser = [SBJsonParser new];
    NSDictionary *jsonResponse = [jsonParser objectWithString:[r asString]];
    NSDictionary *permittedBases= [jsonResponse objectForKey:@"permittedBases"];
    Database *database = [[Database alloc] init];

    for (id key in permittedBases) {
        /* ... */
        [workingDatabases addObject:database];
    }

修改

Ajeet也有一个有效点,确保您的阵列已初始化。

答案 1 :(得分:1)

在使用该数组之前,只需在某处分配您的workingDatabases(Mutable数组)。

分配后,它会正常工作。

答案 2 :(得分:1)

我使用LRResty框架来访问RESTful Web服务。无论如何这是一件奇怪的事情,所以我改用了一种功能更丰富的框架,称为“ASIHTTP”。我建议那些想在iOS上使用RESTful服务(以及更多)的人