NSIndexPath объект показывает как объект NSArray? - PullRequest
1 голос
/ 22 ноября 2011

Я разрабатываю одно приложение, в котором я объявил iVar как объект NSIndexPath, но он отображается как объект NSArray в didSelectRowAtIndexPath. Как это показывает, что это ошибка с моей стороны. Пожалуйста, помогите мне. Заранее спасибо.

Пример кода:

//.h file:
NSIndexPath *lastIndexPath;

//.m file:

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

      if([[default1 objectForKey:@"keyToRepeatString"] isEqualToString:[arrayRepeat   objectAtIndex:i]])
        {
            lastIndexPath=indexPath;
            repeatString=[default1 objectForKey:@"keyToRepeatString"];
        }
}

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
int newRow = [indexPath row];
    int oldRow = [lastIndexPath row];
 }

    int oldRow = [lastIndexPath row];........//Here lastIndexPath shows as NSArray obj?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Похоже на проблему с управлением памятью:

lastIndexPath=indexPath

Эта строка не говорит indexPath о том, чтобы торчать:)

Вам нужно будет поставить это вместо:

[lastIndexPath autorelease];
lastIndexPath = [indexPath retain];

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

0 голосов
/ 22 ноября 2011

То, как вы объявляете указатель, очень мало связано с типом объекта, к которому обращается указатель. Objective-C очень слабо типизирован, и вы можете присвоить, например, адрес UIViewController указателю NSString, при условии, что вы запутываете присваивание, чтобы очень слабая проверка типов в компиляторе не жаловалась.

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

Кроме того, как предположил Александр, если вы не можете сохранить что-то, что должно быть сохранено, объект «позади» адреса может быть освобожден, а затем перераспределен как нечто совершенно иное. (Эта проблема особенно зависит от времени / сценария и может привести к коду, который, например, работает на эмуляторе, но не работает на оборудовании.)

У меня вчера была очень похожая проблема (ошибка в каком-то старом коде, написанном кем-то другим, который таинственным образом начал давать сбой). Я закончил тем, что NSLog указывал description и retainCount указателя в нескольких местах кода, чтобы определить, при каких обстоятельствах он изменялся и почему. (Проблема была в том, что свойство неправильно объявлено assign в другом классе.)

...