Проблема с заполнением Tableview на iPhone - PullRequest
1 голос
/ 25 марта 2009

Код № 1:

NSMutableArray *arrayTmp = [[NSMutableArray alloc] initWithObjects:nil];

[arrayTmp addObject:@"line 1" ];
[arrayTmp addObject:@"line 2" ];

self.list = arrayTmp;
[self.tableView reloadData];
[super viewDidLoad];
[arrayTmp release];

Код № 2:

NSMutableArray *arrayTmp = [[NSMutableArray alloc] initWithObjects:nil];

NSString *fieldName = [[NSString alloc] init];
fieldName = [NSString stringWithFormat:@"%@",@"Ligne1"];
[arrayTmp addObject:(NSString *) fieldName];
[arrayTmp addObject:@"line 2" ];

self.list = arrayTmp;
[self.tableView reloadData];

[super viewDidLoad];
[arrayTmp release];

Коды № 1 и № 2 выполняют одну и ту же работу: они заполняют таблицу. Моя проблема с кодом N ° 2: он отображает tableView, но если я перемещаю tableView пальцем, iphone зависает. Отладчик показывает следующее сообщение: «GDB: сигнал приема программы:« EXC_BAD_INSTRUCTION ». Я не вижу, что это не так. У кого-нибудь есть представление о проблеме? Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 25 марта 2009

Я думаю, что self.list не сохраняет массив, и при заполнении табличного представления вы добавляете ссылки на строки в этом списке. Ваша собственность должна выглядеть так:

@property (retain) NSArray* list;

Это не проблема в первом примере, потому что строки являются буквальными - например, они встроены в вашу программу и никогда не освобождаются.

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

Также этот код;

NSString *fieldName = [[NSString alloc] init];
fieldName = [NSString stringWithFormat:@"%@",@"Ligne1"];

Это приведет к утечке памяти. Вы выделяете новую строку, затем изменяете значение в указателе, чтобы оно стало результатом вызова stringWithFormat. Если вы хотите, чтобы имя поля сохранялось, то правильный код был бы;

NSString *fieldName = [[NSString stringWithFormat:@"%@",@"Ligne1"] retain];
0 голосов
/ 14 июня 2012
self.list=[NSArray arrayWithArray:arrayTmp];

Просто выделите self.list. Это плохой исполнительный директор. Потому что вы не выделяете память для списка.

Удержание не решит проблему

0 голосов
/ 26 марта 2009

Спасибо за ваши ответы.

В конце я решаю свою проблему:

-добавить «сохранить» к моему NNString fieldName

-удаление "выпуска" для переменной в методе tableView "cellForRowAtIndexPath"

Еще раз спасибо за вашу помощь!

0 голосов
/ 26 марта 2009

Вот как вы должны использовать код 2

NSString *fieldName = [[NSString alloc] initWithString:@"Ligne1"];
NSMutableArray *arrayTmp = [NSMutableArray arrayWithObjects:fieldName, @"line2", nil]; //I would suggest using @"Ligne1" instead of fieldName if possible

self.list = [arrayTmp retain]; //This will make sure even after releasing arrayTmp, list is not affected
[self.tableView reloadData];

[arrayTmp release];
0 голосов
/ 25 марта 2009

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

  @property (retain) NSArray *list;

Если в моем коде я поставил:

 NSString *fieldName = [[[NSString alloc] initWithString: @"line 1"] retain];
[arrayTmp addObject:fieldName];
[arrayTmp addObject:@"line 2" ];

это работает!

Но если я поставлю:

NSString *fieldName = [[[NSString alloc] initWithString: [NSString stringWithFormat: @"line 1"] ] retain];
[arrayTmp addObject:fieldName];
[arrayTmp addObject:@"line 2" ];

он хорошо отображает табличное представление, но если я перемещаю tableView 2 или 3 раза пальцем, iphone зависает. И, к сожалению, мне нужно использовать stringWithFormat & stringWithUTF8String для заполнения моего tableView из базы данных.

Ошибка по-прежнему "EXC_BAD_ACCESS". Но я не знаю, как выполнить возврат. Отладчик показывает:

0 0x300c8c18 в objc_msgSend

1 0x30b524dc in - [UILabel text]

2 0x30c07b44 in - [UITableViewCell layoutSubviews]

3 0x30a74020 in - [UIView (CALayerDelegate) _layoutSublayersOfLayer:]

4 0x31dd20f0 in - [CALayer layoutSublayers]

5 0x31dd2000 в CALayerLayoutIfNeeded

6 0x31dd1774 в CAContextCommitTransaction

7 0x31dd143c в CATransactionCommit

8 0x3026a0ec в __CFRunLoopDoObservers

9 0x30269920 в CFRunLoopRunSpecific

10 0x30269326 в CFRunLoopRunInMode

11 0x31563e60 в GSEventRunModal

12 0x30a4feb8 in - [UIApplication _run]

13 0x30a5961c в UIApplicationMain

14 0x000020bc в основном на main.m: 14

asm obj_msgSend 0x300c8cc04: 1 0x300c8c04 <+0000> teq r0, # 0; 0x0

0x300c8c08 <+0004> moveq r1, # 0; 0x0

0x300c8c0c <+0008> bxeq lr

0x300c8c10 <+0012> stmdb sp !, {r3, r4, r5, r6}

0x300c8c14 <+0016> ldr r4, [r0]

0x300c8c18 <+0020> ldr r5, [r4, # 8]

0x300c8c1c <+0024> ldr r6, [r5]

0x300c8c20 <+0028> add r3, r5, # 8; 0x8

0x300c8c24 <+0032> и r5, r6, r1, lsr # 2

0x300c8c28 <+0036> ldr r4, [r3, r5, lsl # 2]

0x300c8c2c <+0040> teq r4, # 0; 0x0

0x300c8c30 <+0044> add r5, r5, # 1; 0x1

0x300c8c34 <+0048> beq 0x300c8c54

0x300c8c38 <+0052> ldr ip, [r4]

0x300c8c3c <+0056> teq r1, ip

0x300c8c40 <+0060> и r5, r5, r6

0x300c8c44 <+0064> bne 0x300c8c28

0x300c8c48 <+0068> ldr ip, [r4, # 8]

0x300c8c4c <+0072> ldmia sp !, {r3, r4, r5, r6}

0x300c8c50 <+0076> bx ip

0x300c8c54 <+0080> ldmia sp !, {r3, r4, r5, r6}

0x300c8c58 <+0084> b 0x300c8c5c

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