разработка iPhone: освобождаемый указатель не был выделен

В Вашем родительском окне:

var yourValue = 'something';
window.open('/childwindow.html?yourKey=' + yourValue);

Тогда в childwindow.html:

var query = location.search.substring(1);
var parameters = {};
var keyValues = query.split(/&/);
for (var keyValue in keyValues) {
    var keyValuePairs = keyValue.split(/=/);
    var key = keyValuePairs[0];
    var value = keyValuePairs[1];
    parameters[key] = value;
}

alert(parameters['yourKey']);

существует потенциально большая проверка ошибок, которую необходимо делать в парсинге пар ключ/значение, но я не включаю его здесь. Возможно, кто-то может обеспечить более содержащую стандартную программу парсинга строки запроса JavaScript в более позднем ответе.

19
задан Slipp D. Thompson 20 October 2013 в 22:00
поделиться

7 ответов

У меня была такая же проблема, с множеством тех же симптомов:

  • освобождаемый указатель не был выделен ошибка
  • обновлен до Xcode 3.2
  • ошибка в коде для изображений

Если я изменю цель сборки на 3.1, ошибки в симуляторе исчезнут. Если я запускаю код на устройстве, ошибки не появляются. Возможно, ошибка в версии 3.0

Мой совет - протестируйте с 3.1 в качестве вашей цели, и, если хотите, вы можете собрать для версии 3.0 для выпуска и не беспокоиться об ошибках, поскольку они не возникают на устройстве.

27
ответ дан 30 November 2019 в 02:34
поделиться

It looks like you have a corrupted memory bug, and it is probably not in this code. Corrupted memory bugs are my second most-fun bugs, partially because they are often non-deterministic, and the symptoms (aka the crashes) usually happen long after the actual bug hit.

There are two main types of memory bugs:

  1. Allocating more than you free.
  2. Freeing more than you allocate.

In this case it looks like you're freeing too much, which is the easier case to see (b/c it can crash earlier) but the harder to track down.

Here is a strategy you can use to help find an extra deallocations:

  • Turn off some of your deallocations.
  • See if the crash still occurs.

Ideally, you can find one single deallocation command which, when removed, will allow your code to work correctly. It might be useful to try a binary search approach, if that is practical for your codebase. If it's a large codebase, hopefully you're using version control and you can try to focus on the recent diff's.

Keep in mind that deallocations can be invoked in several different ways here. Most likely, you're calling release and autorelease on objects. It's also possible you might be explicitly calling dealloc (which is usually a mistake, though). And of course you might even be explicitly calling free directly.

Once you've gotten rid of the extra deallocations, it's a good idea to also check for memory leaks (aka extra allocations). You can do this by using Instruments and other tools. A good place to start is by reading Finding Memory Leaks in the iPhone development guide.

Added: It's also a good idea to set a pointer to nil right after you've released it and are done using it. This way, if you call [objectPtr release]; later, it won't do anything.

(PS Btw, my #1 most-fun bug type is memory corruption in mutlithreaded code. I had one of those once in a multi-million line code base.)

22
ответ дан 30 November 2019 в 02:34
поделиться

Хотя, вероятно, это и не является причиной сбоя, утечка памяти происходит из-за того, что вы не освобождаете context2 , unmasked и mask ] Основные объекты Foundation, использующие CFRelease () , CFImageRelease () или подобные.

3
ответ дан 30 November 2019 в 02:34
поделиться

У меня была такая же проблема со следующим кодом.

-(void)adjustImageToImageView:(UIImage*)img{

float numPixels = 100;
float radius = 5;
UIGraphicsBeginImageContext(CGSizeMake(numPixels, numPixels));
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextBeginPath(c);
CGContextMoveToPoint  (c, numPixels, numPixels/2);
CGContextAddArcToPoint(c, numPixels, numPixels, numPixels/2, numPixels,   radius);
CGContextAddArcToPoint(c, 0,         numPixels, 0,           numPixels/2, radius);
CGContextAddArcToPoint(c, 0,         0,         numPixels/2, 0,           radius);
CGContextAddArcToPoint(c, numPixels, 0,         numPixels,   numPixels/2, radius);
CGContextClosePath(c);

CGContextClip(c);

[img drawAtPoint:CGPointZero];
UIImage *converted = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.imageView.image = converted;   }

Я взял функцию из приложения Twitterfon с открытым исходным кодом.

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

self.imageView.image = [converted retain]

И это остановило сообщения об ошибках в консоли. Я скоро проверю это в Leaks, чтобы узнать, что происходит.

0
ответ дан 30 November 2019 в 02:34
поделиться

Я просто хотел еще раз подтвердить, что у меня была ошибка:

pointer being freed was not allocated

и она исчезла, если я поменял целевую ОС на 3.1, а не на 3.0

0
ответ дан 30 November 2019 в 02:34
поделиться

Я столкнулся с той же ошибкой в ​​моем коде. Что меня озадачило, так это то, что мое приложение работало в OS 3.0 без каких-либо проблем, пока я не внес незначительные изменения в код, не имеющий ничего общего с материалом CGImage *. Но как только он начал выходить из строя, он никогда не работал без сбоев. При переходе на 3.1 все снова заработало. Я сузил ошибку до вызова CGImageRelease (). Либо удаление этой строки, либо добавление сохранения в результирующий UIImage разрешили проблему - хотя это не решение, поскольку приложение будет пропускать память.

Я пробовал использовать NSZombie с инструментами. Это не помогло - приложение вылетало без обнаружения зомби.

Кроме того, собственные примеры приложений Apple (например, TheElements) НЕ дают сбоев, но используют тот же ТОЧНЫЙ код, что и мое приложение. Итак, я изо всех сил пытаюсь принять, что проблема заключается в Framework. А пока я перехожу на 3.1 и двигаюсь дальше.

0
ответ дан 30 November 2019 в 02:34
поделиться

Это может быть только я, но вы не можете сделать следующее?

UIImage *whiteMasked = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return whiteMasked;

whiteMasked размещается в стеке функции и после возврата указатель больше не действителен? Или я что-то упускаю? Если вы используете возвращенный UIImage *, не гарантируется, что он все еще будет там. (это было бы хитом и промахом). Разве вам не нужно выделять UIImage *, а затем автоматически освобождать его перед возвратом?

0
ответ дан 30 November 2019 в 02:34
поделиться