В Вашем родительском окне:
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 в более позднем ответе.
У меня была такая же проблема, с множеством тех же симптомов:
Если я изменю цель сборки на 3.1, ошибки в симуляторе исчезнут. Если я запускаю код на устройстве, ошибки не появляются. Возможно, ошибка в версии 3.0
Мой совет - протестируйте с 3.1 в качестве вашей цели, и, если хотите, вы можете собрать для версии 3.0 для выпуска и не беспокоиться об ошибках, поскольку они не возникают на устройстве.
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:
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:
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.)
Хотя, вероятно, это и не является причиной сбоя, утечка памяти происходит из-за того, что вы не освобождаете context2
, unmasked
и mask
] Основные объекты Foundation, использующие CFRelease ()
, CFImageRelease ()
или подобные.
У меня была такая же проблема со следующим кодом.
-(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, чтобы узнать, что происходит.
Я просто хотел еще раз подтвердить, что у меня была ошибка:
pointer being freed was not allocated
и она исчезла, если я поменял целевую ОС на 3.1, а не на 3.0
Я столкнулся с той же ошибкой в моем коде. Что меня озадачило, так это то, что мое приложение работало в OS 3.0 без каких-либо проблем, пока я не внес незначительные изменения в код, не имеющий ничего общего с материалом CGImage *. Но как только он начал выходить из строя, он никогда не работал без сбоев. При переходе на 3.1 все снова заработало. Я сузил ошибку до вызова CGImageRelease (). Либо удаление этой строки, либо добавление сохранения в результирующий UIImage разрешили проблему - хотя это не решение, поскольку приложение будет пропускать память.
Я пробовал использовать NSZombie с инструментами. Это не помогло - приложение вылетало без обнаружения зомби.
Кроме того, собственные примеры приложений Apple (например, TheElements) НЕ дают сбоев, но используют тот же ТОЧНЫЙ код, что и мое приложение. Итак, я изо всех сил пытаюсь принять, что проблема заключается в Framework. А пока я перехожу на 3.1 и двигаюсь дальше.
Это может быть только я, но вы не можете сделать следующее?
UIImage *whiteMasked = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return whiteMasked;
whiteMasked размещается в стеке функции и после возврата указатель больше не действителен? Или я что-то упускаю? Если вы используете возвращенный UIImage *, не гарантируется, что он все еще будет там. (это было бы хитом и промахом). Разве вам не нужно выделять UIImage *, а затем автоматически освобождать его перед возвратом?