如何在目标c中保留方法之外的数组

时间:2011-08-04 21:01:56

标签: iphone objective-c arrays release

在ASIFormDataRequest之后,我从JSON创建一个临时NSMutableArray * resultArray,然后将其添加到已定义的NSMutablearray * myData

-(void)viewDidLoad{
    myData = [[NSMutableArray alloc] init];
    //request that calls gotInfo method
}

-(void)gotInfo:(ASIFormDataRequest *)request{
    NSString *responseString = [request responseString];
    NSMutableArray *resultArray = [responseString yajl_JSON];
    [myData addObject:resultArray];
}

-(IBAction)doSomethingWithData:(id)sender{
    //something with myData
}

但是当我尝试从gotInfo:方法之外调用myData时,我得到了错误的访问错误,当我在方法之外检查myData时,它显示了kern_protection_failure。所以我猜测在方法之外,resultArray显然已经发布了,但它也是从myData发布的,因为myData中的对象共享相同的内存位置? 我也试过

-(void)gotInfo:(ASIFormDataRequest *)request{
    NSString *responseString = [request responseString];
    [myData addObject:[responseString yajl_JSON]];
}

如何保存myData?

在我的标题文件中:

#import <UIKit/UIKit.h>

@class ASIFormDataRequest;

@interface EventsTableController : UITableViewController <UITableViewDataSource>{
    NSMutableArray *myData;
}
-(void)gotInfo:(ASIFormDataRequest *)request;

更新

所以在gbd中,myData被分配为0x5e96560所以我做了

po 0x5e96560

然后我得到EXC_BAD_ACCESS,原因是地址为KERN_PROTECTION_FAILURE:0x00000009

但如果我这样做

po [[0x5e96560 objectAtIndex:0] objectForKey:@"key"]

然后我得到了价值! whyyyyyy?

4 个答案:

答案 0 :(得分:0)

你没有任何办法正确访问myData,因为你将它声明为EventsTableController中的成员,但是你没有为它设置@property,也没有合成它。通过在EventsTableController.m文件中合成它,您告诉xcode生成正确触摸myData所需的getter / setter,这是您的程序似乎失败的地方。如果你这样做,这应该可以解决你的问题。

-Karoly

答案 1 :(得分:0)

除了您的ivar的不同名称(mienVarmyVar)之外,我没有看到任何问题。其他一些代码必须释放你的ivar,或者你正在访问之前 viewDidLoad有机会实际创建数组(我敢打赌它是后者)。

我认为你应该将代码放在viewDidLoad的初始化方法中。不要忘记在dealloc中发布数组。

当然,您也可以编写自己的myData getter方法,进行延迟初始化,而不是在init方法中创建它:

- (NSMutableArray *) myData
{
    if (!myData)
        myData = [[NSMutableArray alloc] init];
    return myData;
}

请注意,现在,您应该访问 self.myData ,如果您想使用它。

答案 2 :(得分:0)

@property(nonatomic,retain) NSMutableArray *myData 

并创建对象

self.myData = [[NSMutableArray alloc] init];

// and i assume your resultArray is a mature NSMutableArray object
[self.myData addObject:resultArray];
  

使用我能想到的副本的最佳方法是始终将NSString属性设置为“copy”而不是retain。这样,如果你陷入困境并忘记释放一个物体所持有的弦,你可以从Leaks乐器获得更准确的读数。需要更仔细地考虑其他复制用途。

注意:您有责任在不使用该变量后释放myData。

答案 3 :(得分:0)

我认为NSString yajl_JSON类别可以返回数组或字典 - 您可能需要检查下面一行中结果数组的类型,因为它可能是一个NSDictionary:

NSMutableArray * resultArray = [responseString yajl_JSON];

如果你将它作为一个数组处理它的字典可能会导致你的问题。

(以下NSObject + YAJL类别的相关代码)

YAJLDocument *document = [[YAJLDocument alloc] initWithData:data parserOptions:options error:error];
id root = [document.root retain];
[document release];
return [root autorelease];

(和YAJLDocument对象中)

@interface YAJLDocument : NSObject <YAJLParserDelegate> {
(id root_; // NSArray or NSDictionary