Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string()
.
Эти примеры уязвимы для SQL-инъекции:
$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");
или
$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");
В обоих случаях вы не можете использовать '
для защиты инкапсуляции.
Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)
Когда Вы добавляете объект к массиву, это звонит retain
на том объекте. Если Вы не выпустите свой указатель на тот объект, это будет утечка. При выпуске массива он будет звонить release
на всех объектах, которые он содержит, так как он звонил retain
ранее.
Что касается автовыпуска по сравнению с выпуском, единственный способ знать наверняка (кроме возможного чтения документации) под названием метод. Я полагаю, что правило в целом состоит в том, что, если Вы не выделили объект, тогда Вы не ответственны за выпуск его.
Относительно методов создания объекта, всех удобных методов (array:
, arrayWithObjects:
, arrayWithArray:
, и т.д.) возврат автовыпустил объекты. Однако их соответствующие init методы (init:
, initWithObjects:
, initWithArray:
, и т.д.) не делают - при вызове их Вы ответственны за вызов release
на возвращенном объекте.
я, кажется, вспоминаю несколько других вопросов по этой теме здесь - Вы могли бы попытаться искать вокруг более полное объяснение.
Легче думать об управлении памятью Objective C как владение , а не с точки зрения сохранять-выпуска. Когда Вы добавляете объекты к массиву, массив является теперь совладельцем объекта и ответственен за то, что правильно управлял памятью. Когда владелец (независимо от того, что объект содержит код, который Вы отправили) вызовы release
на объектах, это бросает владение, и теперь массив является единственным владельцем.
Apple имеет хорошую краткую информацию о том, как владение работает в Какао (включая то, как Вы знаете, когда Вы ответственны за вызов release
на объекте): Руководство по программированию управления памятью Для Какао . Это - обязательное для чтения, если Вы хотите использовать Какао.
Основная вещь помнить является этим: необходимо сбалансировать каждый вызов к "init", "сохранить" или "скопировать" с соответствующим вызовом, чтобы "выпустить" или "автовыпустить". Это - действительно все, что необходимо знать.
В Вашем примере, a1 имел вызов к "init", таким образом, у Вас должен быть "выпуск" где-нибудь на нем. Так же с "obj". Вы не назвали "init", "сохранили" или "скопировали" на чем-либо еще, таким образом, Вы не должны называть "выпуск" или "автовыпуск" ни на чем больше.
Я не знаю, прав я или нет
NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease
NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease
после того, как вы [a1 removeAllObjects];