NSMutableArray и NSDictionary Error - PullRequest
       15

NSMutableArray и NSDictionary Error

2 голосов
/ 26 августа 2011

У меня есть один NSMutableArray с именем SubList, который содержит 262 элемента. Каждый объект является NSDictionary!

Этот код работает как шарм!

for (NSDictionary *element in listSub){
    [cell.textLabel setText:[element objectForKey:@"title"]];  

}  

Но если я попытаюсь использовать этот код, я получу ошибку SIGBART!

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];

[cell.textLabel setText:[element objectForKey:@"title"]];

Так в чем же проблема?

* РЕДАКТИРОВАТЬ, проблема в этой строке

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];

и это описание Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «- [__NSCFSet objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x89a8d90» Спасибо

** Редактировать Это вывод listSub!

listSub: {(
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Web Programming";
                label = "Web Programming";
            }
        );
        firstitemmsec = 1265885595862;
        id = "feed/http://feeds.feedburner.com/FamousBloggers";
        sortid = A11327DE;
        title = "Famous Bloggers";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            }
        );
        firstitemmsec = 1241258413829;
        htmlUrl = "http://backtrack-italia.blogspot.com/";
        id = "feed/http://feeds2.feedburner.com/BackTrackItalia";
        sortid = E8A04F76;
        title = "Back Track Italia";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            }
        );
        firstitemmsec = 1245376992188;
        htmlUrl = "http://www.offensive-security.com";
        id = "feed/http://www.offensive-security.com/blog/feed/";
        sortid = 92F57555;
        title = "BackTrack Information Security Distribution";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/iOS Developer";
                label = "iOS Developer";
            }
        );
        firstitemmsec = 1296830392306;
        htmlUrl = "http://amix.dk/Main/";
        id = "feed/http://feeds.feedburner.com/amixdk";
        sortid = 110C52C3;
        title = "amix.dk blog";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            }
        );
        firstitemmsec = 1285261350202;
        htmlUrl = "http://www.appletvhacks.net";
        id = "feed/http://www.appletvhacks.net/feed/";
        sortid = 81125D2E;
        title = "Apple TV Hacks";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            }
        );
        firstitemmsec = 1293230300220;
        htmlUrl = "http://www.appletvitalia.it";
        id = "feed/http://www.appletvitalia.it/feed/";
        sortid = 892FE61C;
        title = "Apple Tv Italia";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            }
        );
        firstitemmsec = 1270115980935;
        htmlUrl = "http://www.appleecious.com";
        id = "feed/http://feeds2.feedburner.com/appleecious";
        sortid = 00B5AFC2;
        title = Appleecious;
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            }
        );
        firstitemmsec = 1258495136927;
        htmlUrl = "http://www.rawseo.com/news";
        id = "feed/http://www.rawseo.com/news/feed/";
        sortid = D6766911;
        title = "A blend of programming and seo";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/Seo e Web Marketing";
                label = "Seo e Web Marketing";
            }
        );
        firstitemmsec = 1233684720758;
        htmlUrl = "http://it-adsense.blogspot.com/";
        id = "feed/http://it-adsense.blogspot.com/atom.xml";
        sortid = 9FB570ED;
        title = "AdSense Blog-Italiano";
    },
        {
        categories =         (
        );
        firstitemmsec = 1277627346000;
        htmlUrl = "http://aext.net";
        id = "feed/http://feeds.feedburner.com/aextnet";
        sortid = 70800CFE;
        title = "AEXT.NET NET MAGAZINE";
    },
        {
        categories =         (
        );
        firstitemmsec = 1217001547735;
        htmlUrl = "http://www.alessandroscoscia.it";
        id = "feed/http://feeds.feedburner.com/alessandroscoscia";
        sortid = 51CB8E6E;
        title = "Alessandro Scoscia";
    },
        {
        categories =         (
                        {
                id = "user/14761688561595773457/label/iOS Developer";
                label = "iOS Developer";
            }
        );
...

Я уверен, что это не NSSet.

Теперь я публикую код, который я использую для заполнения моего массива.

 NSError *error;
    NSURLResponse *response;
    NSData  *dataReply = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
    NSString *string = [[NSString alloc] initWithData:dataReply encoding:NSASCIIStringEncoding];
    NSLog(@"testing %@",string);


    SBJsonParser *vol= [[SBJsonParser alloc]init];
    if (string) {
        NSArray *feeds = [vol objectWithString:string error:nil];
        NSDictionary *results = [string JSONValue];
        NSArray *subs = [results valueForKey:@"subscriptions"];

        for (NSDictionary *iscrizione in subs){

            [subscriptions addObject:iscrizione];

        }

Это часть другого класса, а также этой части моего кода, если я попытаюсь сделать что-то вроде этого: NSDictionary * element = [listSub objectAtIndex: 0]; NSLog ([элемент objectForKey: @ "title"]);

Я получаю ту же ошибку, когда пытаюсь выполнить цикл, подобный этому

for (NSDictionary *element in listSub){
    [cell.textLabel setText:[element objectForKey:@"title"]];  

} 

Все работает без ошибок NSSet. Это сводит меня с ума!

Ответы [ 5 ]

2 голосов
/ 26 августа 2011

Проблема, вероятно, в том, что listSub не был должным образом сохранен и, следовательно, уже освобожден. Теперь память используется повторно, и объект по этому адресу теперь является __NSCFSet, который не отвечает на objectAtIndex:.

Обратите внимание, что автоматически высвобождаемые объекты, возвращаемые методом вспомогательного класса, таким как [NSMutableArray arrayWithXXX], должны сохраняться и освобождаться только тогда, когда они больше не нужны. Лучший способ убедиться, что они сохранены - это объявить @property(retain) NSArray *subList, @synthesize it и использовать self.subList во всех случаях, кроме, возможно, dealloc.

Добавление

Было предложено, чтобы метод, который создал subList, возвращал набор, а не массив. Если бы это было так, простой цикл в начале ответа также не работал бы. Вот почему я считаю очень маловероятным, что subList изначально был NSSet, и гораздо более вероятно, что массив был перевыпущен и освобожден, а память повторно использовалась для NSSet.

Пожалуйста, делайте то, что люди, которые хотят вам помочь, просят вас .

Добавить строку

NSLog(@"listSub: %@", listSub);

в месте, где установлен listSub, а также прямо перед строкой ошибки. Затем посмотрите в журнале ошибок, что он показывает, и сообщите нам.

1 голос
/ 26 августа 2011

listSub это не массив, это NSSet.

1 голос
/ 26 августа 2011

Вы пробовали:

[cell.textLabel setText:[element objectForKey:@"title"]];  

Что это за "лол" ??

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

Просто попробуйте это.

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];
[cell.textLabel setText:[NSString stringWithFormat:@"%@",[element objectForKey:@"title"]]];

Или попробуйте это, поскольку у вас есть отредактированный вопрос, Редактировать

NSDictionary *element = [[NSDictionary alloc] initWithDictionary:[listSub objectAtIndex:indexPath.row]];
[cell.textLabel setText:[element objectForKey:@"title"]];
[element release];
0 голосов
/ 26 августа 2011

проблема здесь

[cell.textLabel setText:[NSString stringWithFormat:[element objectForKey:@"title"]]];

когда вы вызываете stringWithFormat, вам нужно задать формат в строковом литеральном виде, например,

[cell.textLabel setText:[NSString stringWithFormat:@"%@",[element objectForKey:@"title"]]];

или указать текст без вызова stringWithFormat:

ваш массив был выпущен где-то, поэтому для решения проблемы вам нужно вызвать retain для массива tyour в нужном месте.

...