Сбой NSString при выпуске - PullRequest
       15

Сбой NSString при выпуске

0 голосов
/ 30 марта 2012

Я использую NSString для добавления строк, но когда я выпускаю «cacheStr» NSString, происходит сбой симулятора iphone. Где я должен поставить код релиза?

код инициализации: я использую три строки NSString для добавления содержимого массива данных.

</p>

<pre><code>NSMutableArray *dataArray = [[NSMutableArray alloc] init];
NSString *cacheStr = [[NSString alloc] init];
NSString *tmpStr = [[NSString alloc] init];
NSString *notiyStr = [[NSString alloc] initWithFormat:@"This is a test message!"];
dataArray = [NSArray arrayWithObjects:
                      @"currency1.png",
                      @"currency2.png",
                      @"currency3.png",
                      @"currency4.png",
                      @"currency5.png",
                      @"xxxxxx",
                      @"currency1.png",
                      @"currency2.png",
                      @"currency3.png",
                      @"currency4.png",
                      @"currency5.png",
                      @"xxxxxx",
                      nil];

</p> <p>append string code : use for loop to append strings.</p> <p><pre></p> <pre>int isFailed = 0; int countOfDataArray = [dataArray count]; if (!isFailed) { for (int i=0; i < countOfDataArray; i++) { if ([[dataArray objectAtIndex:i] isEqualToString:@"xxxxxx"]) { tmpStr = [cacheStr stringByAppendingFormat:@"%@\n", [dataArray objectAtIndex:i]]; } else { tmpStr = [cacheStr stringByAppendingFormat:@"value %d : %@\n", i+1, [dataArray objectAtIndex:i]]; } cacheStr = [tmpStr copy]; [tmpStr release]; } } tmpStr = [notiyStr stringByAppendingString:cacheStr];

код выпуска: когда я добавляю [выпуск cacheStr], симулятор падает ...

</p>

<pre>[dataArray release];
[notiyStr release];
// [cacheStr release];     /*  crash ... */
</code>

Спасибо!

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

проще объявить строку NSString следующим образомNSString *tmpStr = @"This is a test message!";тогда нет необходимости освобождать его, когда вы не используете alloc

1 голос
/ 30 марта 2012

Это

NSMutableArray *dataArray = [[NSMutableArray alloc] init];
dataArray = [NSArray arrayWithObjects:
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  nil];

странно! Вы выделяете изменяемый массив и назначаете указатель, указывающий на этот массив, массиву, который вам не принадлежит. Вероятно, он уже (автоматически) выпущен, когда вы пытаетесь его использовать. Следовательно, int countOfDataArray = [dataArray count]; приведет к тому, что countOfDataArray будет нулевым. Поэтому cacheStr никогда не устанавливается. Тем не менее, не должно произойти сбой при выпуске cacheStr.

Измените его на:

NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects: @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  nil];

и с тобой все будет в порядке.

0 голосов
/ 30 марта 2012

не использовать [NSString alloc] init. Использовать значение NSString = @ "Сообщение"; Нет необходимости выпускать его.

...