在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?
答案 0 :(得分:0)
你没有任何办法正确访问myData,因为你将它声明为EventsTableController中的成员,但是你没有为它设置@property,也没有合成它。通过在EventsTableController.m文件中合成它,您告诉xcode生成正确触摸myData所需的getter / setter,这是您的程序似乎失败的地方。如果你这样做,这应该可以解决你的问题。
-Karoly
答案 1 :(得分:0)
除了您的ivar的不同名称(mienVar
与myVar
)之外,我没有看到任何问题。其他一些代码必须释放你的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