Автопрокрутка текстового поля использует больше памяти, чем ожидалось

Для iOS 5.1.1 и ниже, используйте openURL метод UIApplication. Это выполнит нормальный iPhone волшебная реинтерпретация URL. так

[someUIApplication openURL:[NSURL URLWithString:@"http://maps.google.com/maps?q=London"]]

должен вызвать приложение карт Google.

From iOS 6, Вы будете вызов Apple's собственное приложение Карт. Для этого настройте MKMapItem объект с местоположением, которое Вы хотите отобразить, и затем отправить ему эти openInMapsWithLaunchOptions сообщение. Для запуска в текущем местоположении попробуйте:

[[MKMapItem mapItemForCurrentLocation] openInMapsWithLaunchOptions:nil];

Вы должны будете быть связаны против MapKit для этого (и он запросит доступ местоположения, я верю).

15
задан John Saunders 9 February 2011 в 04:01
поделиться

2 ответа

Как вы определяете использование памяти? Вам нужно будет следить за использованием памяти CLR для вашего приложения, а не за памятью, используемой системой для всего приложения (для этого вы можете использовать Perfmon). Возможно, вы уже используете правильный метод мониторинга.

Мне кажется, что вы используете StringBuilder для внутренних целей. Если это так, то это объясняет удвоение памяти, потому что StringBuilder работает таким образом внутри.

GC.Collect () может ничего не делать, если ссылки на ваши объекты все еще находятся в области видимости, или если какой-либо из ваших кодов использует статические переменные.


РЕДАКТИРОВАТЬ:
Я оставлю вышесказанное, потому что это все еще может быть правдой, но я просмотрел внутренности AppendText . Он не добавляет (т. Е. К StringBuilder), вместо этого он устанавливает свойство SelectedText , которое не устанавливает строку, а отправляет сообщение Win32 (строка кэшируется при извлечении).

Поскольку строки неизменяемы, это означает, что для каждой строки будет три копии: один в вызывающем приложении, один в «кеше» базового элемента управления и один в фактическом элементе управления текстовым полем Win32. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

который не устанавливает строку, но отправляет сообщение Win32 (строка кэшируется при извлечении).

Поскольку строки неизменяемы, это означает, что для каждой строки будет три копии: одна в вызывающем приложении, одна в " cache "базового элемента управления и один в фактическом элементе управления текстовым полем Win32. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

который не устанавливает строку, но отправляет сообщение Win32 (строка кешируется при извлечении).

Поскольку строки неизменяемы, это означает, что для каждой строки будет три копии: одна в вызывающем приложении, одна в " cache "базового элемента управления и один в фактическом элементе управления текстовым полем Win32. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

Поскольку строки неизменяемы, это означает, что для каждой строки будет три копии: одна в вызывающем приложении, одна в «кеше» базового Control и одна в фактическом текстовом поле Win32. контроль. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

Поскольку строки неизменяемы, это означает, что для каждой строки будет три копии: одна в вызывающем приложении, одна в «кеше» базового Control и одна в фактическом текстовом поле Win32. контроль. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

базового элемента управления и один в фактическом элементе управления текстовым полем Win32. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить в SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

базового элемента Control и один в фактическом элементе управления текстовым полем Win32. Каждый символ имеет ширину два байта. Это означает, что любой 1 МБ текста будет занимать 6 МБ памяти (я знаю, это немного упрощенно, но в основном это происходит).

РЕДАКТИРОВАТЬ 2: не уверен, внесет ли он какие-либо изменения, но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

но вы можете сами позвонить в SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

но вы можете сами позвонить по SendMessage . Но начинает казаться, что вам понадобится собственный алгоритм прокрутки и собственное текстовое поле, нарисованное владельцем, чтобы освободить память.

3
ответ дан 1 December 2019 в 05:23
поделиться

Отслеживание объема памяти, используемой приложением, особенно языком со сборкой мусора, является сложной задачей. Люди часто использовали общий счет памяти для приложения, чтобы определить объекты, которые все еще используются (например, через диспетчер задач). Это сомнительно эффективно для собственных приложений, но даст очень вводящие в заблуждение результаты для управляемых приложений.

Чтобы правильно определить объем памяти, используемый вашими объектами CLR, вам необходимо использовать инструмент, специально предназначенный для его измерения. Например, я считаю, что лучше всего использовать комбинацию WinDbg и sos.dll для измерения текущих корневых объектов. Это сообщит вам размер ваших управляемых объектов и укажет, какие объекты фактически занимают дополнительную память.

Вот хорошая статья на

1
ответ дан 1 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: