Проблемы с получением номера раздела? - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь нарисовать количество строк в зависимости от того, в каком разделе они находятся. Код:

-(void)configureView:(NSDictionary *)serverResult{

    NSManagedObject * detailData = [serverResult valueForKey:@"details"];
        NSSet * projID = [detailData valueForKey:@"PROJECTID"];
        NSSet * projStat = [detailData valueForKey:@"PROJECTSTATUS"];
        NSSet * appDate = [detailData valueForKey:@"BOARDAPPROVALDATE"];
        NSSet * closeDate = [detailData valueForKey:@"LOANCLOSINGDATE"];
        NSSet * countryName = [detailData valueForKey:@"COUNTRYNAME"];
        NSSet * regionName = [detailData valueForKey:@"REGIONNAME"];
        NSSet * envCatCode = [detailData valueForKey:@"ENVASSESMENTCATEGORYCODE"];
        NSSet * teamLeader = [detailData valueForKey:@"TEAMMEMFULLNAME"];
        NSSet * borrower = [detailData valueForKey:@"BORROWER"];
        NSSet * impAgency = [detailData valueForKey:@"IMPAGENCY"];
        NSSet * totalCost = [detailData valueForKey:@"LENDINGPROJECTCOST"];
        NSSet * comtAmt = [detailData valueForKey:@"IBRDPLUSIDAAMT"];
        basic = [NSArray arrayWithObjects:projID, projStat, appDate, closeDate,countryName,regionName,envCatCode,teamLeader,borrower,impAgency,totalCost,comtAmt, nil];
}
    - (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
    {
        int number;
        switch (section) {
            case 0:
                number = basic.count;
                break;
            case 1:
                number = allSectors.count;
                break;
            case 2:
                number = 1;
                break;

            default:
                break;

        }
        return number;
    }

Но код вылетает с EXC_BAD_Access. Помогите, пожалуйста!

1 Ответ

4 голосов
/ 08 июля 2011

Обычно это означает, что вы пытаетесь получить доступ к уже выпущенной переменной. Судя по тому, как вы обращаетесь к ивару напрямую (не через геттеры), это говорит о том, что вы делаете все управление памятью самостоятельно, что может быть непросто, чтобы всегда получить право.

В этой строке, где вы устанавливаете массив, вы получаете автоматически выпущенный массив

basic = [NSArray arrayWithObjects:projID, projStat, appDate, closeDate,countryName,regionName,envCatCode,teamLeader,borrower,impAgency,totalCost,comtAmt, nil];

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

1

// The preferred way in this instance
basic = [[NSArray alloc] initWithObjects:projID, projStat, appDate, closeDate,countryName,regionName,envCatCode,teamLeader,borrower,impAgency,totalCost,comtAmt, nil];

2

// Not the best way
basic = [[NSArray arrayWithObjects:projID, projStat, appDate, closeDate,countryName,regionName,envCatCode,teamLeader,borrower,impAgency,totalCost,comtAmt, nil] retain];

В любом случае это может быть удобно, чтобы прочитать об управлении вашей памятью.

Гораздо проще использовать синтезированные геттеры / сеттеры для свойств и не получать прямой доступ к ивару, если вы действительно не хотите любить методы init и dealloc.

Другая проблема, которую я вижу (не связанная с падением), заключается в том, что вы не инициализировали number ни для чего, и вы не установили его в случае default в операторе switch, это может быть причиной ошибки, которая сложно отследить позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...