По предложению @ n.m. я проверил весь код. И я думаю, что нашел проблему. Упрощенный конструктор / деструктор класса и манипулирование следующим образом:
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
struct leak_struct {
vector<string> array;
int set;
};
int main(){
leak_struct ls;
ls.array.push_back("hello");
ls.array.push_back("world");
memset(&ls, 0, sizeof(ls));
ls.array.push_back("code");
ls.array.push_back("review");
memset(&ls, 0, sizeof(ls));
return 0;
}
Причина, по которой он пропускает, заключается в строке, где вызывается memset, этот вызов обнулит указатель вектора в структуре и делает новый выделенный буфер не освобожденным. .
Невозможно предотвратить перемещение курсора. Однако вы можете запретить им редактировать текст, кроме как в конце, реализовав метод
- textField: shouldChangeCharactersInRange: replaceString:
в делегате текстового поля.
Изменить: вы также можете установить userInteractionEnabled
- НЕТ
, чтобы пользователь не мог коснуться поля. Вызовите статьFirstResponder
вручную, чтобы поле стало фокусом, поскольку пользователь не может нажать, чтобы сфокусироваться.
Я не проверял, можно ли отключить увеличительное стекло, но рекомендуемый способ выборочного отключения режима редактирования в UIResponder (и, следовательно, в UITextField) - реализовать canPerformAction: withSender
из UIResponder
.
См. документацию UIResponder .
Возможно, если вы вернете «NO» для действия select и selectAll, вы сможете отключить его.
Другой, более жестокий способ - перехватить любое событие касания и сбросить курсор до конца.