2010-09-09 2 views
0

Я только что вскочил в Objective-C, и я застрял довольно рано. Я отправлю код с моим вопросом, но чтобы он был читабельным, я избавлюсь от некоторых из дерьма, дайте мне знать, хотите ли вы добавить больше кода!Не удается получить доступ к объектам в объекте-c

Я создал новый объект под названием «Фраза» (подкласса из NSObject) и читаю элементы из JSON в эти объекты «Фраза» и добавляю их в массив. Вот первый много кода:

Пример JSON:

{ 
    "phrases": [ 
     { 
      "title": "Title of my Phrase", 
     "definition" : "A way to look at some words", 
    "location" : "Irish Proverb" 
     } 
    ] 
    } 

Script Я читаю его с:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

self.phraseDictionary = [[NSMutableArray alloc] initWithObjects:nil]; 

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"phrase" ofType:@"json"]; 
NSString *myRawJSON = [[NSString alloc] initWithContentsOfFile:filePath]; 

NSData *jsonData = [myRawJSON dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
NSDictionary *entries = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil]; 


for (id key in entries) { 

    NSObject *phrases = [entries objectForKey:key]; 

    for (id phrase in phrases) { 

    Phrase *pushArrayToPhrase = [[Phrase alloc] initWithText:[phrase objectForKey:@"title"] definition:[phrase objectForKey:@"definition"] location:[phrase objectForKey:@"location"]]; 
    [self.phraseDictionary addObject:pushArrayToPhrase]; 

    } 

    } 
    } 

Фраза м файла:

#import "Phrase.h" 


@implementation Phrase 

@synthesize title; 
@synthesize definition; 
@synthesize location; 

- (id)init { 
self = [super init]; 
if (self != nil) { 
    title = @""; 
    definition = @""; 
    location = @""; 
} 
return self; 
} 

- (id)initWithTitle:(NSString *)tit definition:(NSString *)def location:(NSString *)loc { 
self = [super init]; 
if (self != nil) { 
    title = tit; 
    definition = def; 
    location = loc; 
} 
return self; 
} 


@end 

Отсюда я цикл через объекты и добавить их в список в моем SPLITVIEW:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 

// Dequeue or create a cell of the appropriate type. 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    Phrase *cellPhrase = [self.phraseDictionary objectAtIndex:indexPath.row]; 
cell.textLabel.text = cellPhrase.title; 
return cell; 
} 

Но когда я нажимаю элемент, и попросить фразы на основе indexPath.row из один щелкнул, я может только получить доступ к свойству, используемому в cell.textLabel.text. Любая другая попытка отсюда войти для доступа к объекту из объекта Phrase выходит из симулятора.

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

Phrase *cellPhrase = [self.phraseDictionary objectAtIndex:indexPath.row]; 
detailViewController.detailItem = cellPhrase; 
//If i attempt 'cellPhrase.definition' here, the app will close without an error 

} 

Надеюсь, что это легко понять, дайте мне знать, если это не так, и я попробую еще раз!

+0

Информации о том, почему они существуют? Вы проверили журналы? –

+0

Как я только что опубликовал ниже, я получил этот «Сигнал приема программы:« EXC_BAD_ACCESS ».» когда я включил отладку. Я видел эту ссылку http://stackoverflow.com/questions/327082/exc-bad-access-signal-received, но не мог связать ее с моей ситуацией ... –

ответ

1

В методе initWithTitle вы назначаете переменные, но не сохраняете их. Если они не будут сохранены в любом месте, они будут выпущены, и когда вы попытаетесь получить к ним доступ, ваше приложение выйдет из строя. Если вы не получаете сообщений об ошибках, убедитесь, что вы включили отладку.

+0

Что вы имеете в виду, назначая, но не сохраняя? (Я новичок в этом, так что все еще получаю голову от назначения/сохранения и т. Д.). Где у меня есть title = tit; definition = def и т. Д. В методе initWithTitle, мне нужно делать это по-другому? –

+0

Также - я включил отладку, и получаю «Сигнал, полученный программой»: «EXC_BAD_ACCESS». » –

+0

Когда вы делаете title = tit; нет ничего, что остановило бы память, зарезервированную строкой, которая будет выпущена позже. Поэтому в следующий раз, когда вы попытаетесь получить доступ к строке, ваша программа будет разбита, поскольку память уже недействительна. Чтобы предотвратить это, попробуйте title = [tit сохранить]; или если ваши свойства сохранены, вы можете сделать self.title = tit; Затем в вашем методе dealloc сделайте [title release]; чтобы потом очистить память. – skorulis