как сохранить массив вне метода в цели c - PullRequest
0 голосов
/ 05 августа 2011

После ASIFormDataRequest я создаю временный NSMutableArray * resultArray из JSON, а затем добавляю его в определенный 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
}

но когда я пытаюсь вызвать myData извне метода gotInfo:, я получаю неправильные ошибки доступа, и когда я проверяю myData вне метода, он показывает kern_protection_failure. Так что я предполагаю, что за пределами метода, resultArray, очевидно, освобождается, но он также освобождается от myData, так как объект внутри myData находится в той же области памяти? Я тоже пробовал

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

Как мне сохранить мои данные ??

в моем заголовочном файле:

#import <UIKit/UIKit.h>

@class ASIFormDataRequest;

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

UPDATE:

поэтому в gbd myData выделяется как 0x5e96560, поэтому я сделал

po 0x5e96560

и затем я получаю EXC_BAD_ACCESS по причине KERN_PROTECTION_FAILURE по адресу: 0x00000009

но если я сделаю

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

тогда я получу значение! whyyyyyy

Ответы [ 4 ]

0 голосов
/ 05 августа 2011

Я думаю, что категория 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
0 голосов
/ 05 августа 2011

За исключением другого имени вашего ивара (mienVar против myVar), я не вижу проблемы. Какой-то другой код должен освобождать ваш ivar, или вы обращаетесь к нему до того, как viewDidLoad сможет фактически создать массив (держу пари, что это последний).

Я думаю, вы должны вместо этого поместить код в viewDidLoad в свой метод инициализации. Не забудьте освободить массив в dealloc.

Конечно, вы также можете написать свой собственный метод получения myData, выполняя ленивую инициализацию, вместо создания его в методе init:

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

Обратите внимание, что теперь вы должны получить доступ к self.myData , если хотите его использовать.

0 голосов
/ 05 августа 2011
@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 значение «копировать», а не сохранять. Таким образом, вы получите более точные показания от инструмента «Утечки», если запутались и забыли выпустить строку, за которую держится объект. Другие варианты использования копии должны быть более тщательно продуманы.

ПРИМЕЧАНИЕ. Вы несете ответственность за освобождение myData после того, как эта переменная не используется.

0 голосов
/ 05 августа 2011

У вас действительно нет никакого способа правильно обращаться к myData, поскольку вы объявляете его как член в EventsTableController, но вы не устанавливаете для него @property и не синтезируете его.Синтезируя его в файле EventsTableController.m, вы сообщаете xcode для генерации методов получения / установки, которые необходимы для правильного прикосновения к myData, в котором ваша программа, похоже, дает сбой.Если вы сделаете это, это должно решить вашу проблему.

-Karoly

...