Вы пробовали [textView sizeThatFits:textView.bounds]
?
Редактирование: sizeThatFits возвращает размер, но на самом деле не изменяет размеры компонента. Я не уверен, является ли это тем, что Вы хотите, или если [textView sizeToFit]
больше, что Вы искали. В любом случае я не знаю, будет ли он совершенно пригодный, содержание как Вы хочет, но это - первая вещь попробовать.
Причина, по которой преинкремент работает быстрее, заключается в том, что постинкремент должен сделать копию старого значения для возврата. Как сказано в GotW # 2 : «Преинкремент более эффективен, чем постинкремент, потому что для постинкремента объект должен увеличивать себя, а затем возвращать временное значение, содержащее его старое значение. Обратите внимание, что это верно даже для встроенных функций, таких как int. "
GotW # 55 предоставляет каноническую форму постинкремента, которая показывает, что он должен выполнять преинкремент плюс еще некоторая работа:
T T::operator++(int)
{
T old( *this ); // remember our original value
++*this; // always implement postincrement
// in terms of preincrement
return old; // return our original value
}
Как отмечали другие, некоторые компиляторы могут оптимизировать это в некоторых случаях , но если вы не используете возвращаемое значение, рекомендуется не полагаться на эту оптимизацию. Кроме того, разница в производительности, вероятно, будет очень небольшой для типов, которые имеют тривиальные конструкторы копирования,
Вряд ли это будет иметь значение для вектора.
В общем, ++ it
вряд ли будет медленнее, чем it ++
( предполагая разумную реализацию, если они перегружены), и может быть быстрее. Причина в том, что если сам класс итератора вообще сложен, то поскольку it ++
должен вернуть значение до того, как it
будет увеличено, реализация обычно сделает копию.
Векторные итераторы, вероятно, являются «просто указателями» (в оптимизированных, неотладочных сборках), и оба operator ++
будут встроены. Поскольку возвращаемое значение не используется, копия обычно пропускается. Так что никакой разницы не будет. Я имею обыкновение набирать ++ it
, потому что:
1) Когда-нибудь это может иметь значение,
it ++
выполняет следующие операции:
it
it
it
++ it
выполняет следующие операции:
it
it
Поскольку it ++
создает копию, он может можно сказать, что он «медленнее». Однако любой достойный компилятор оптимизирует эту разницу для большинства определенных типов. Для некоторых типов, определяемых пользователем, может быть быстрее.
Иногда да. С некоторыми он будет оптимизирован и останется таким же. Для std :: vector <> (и других std-итераторов) он, скорее всего, будет оптимизирован таким же образом.
да ++ это более эффективно, потому что ++ необходимо вернуть копию объекта, а затем увеличить его.
Да. Насколько я помню, ++ более эффективен, чем ++, потому что ++ создает временный объект, а ++ - нет.
Есть вероятность, что он ++ создаст временную копию.
Кроме того, в C ++ есть вероятность, что кто-то перегрузил оператор постинкремента.
Обе эти вещи могут снижение производительности по сравнению с прединкрементом. На практике это вряд ли будет иметь значение. В частности, временная копия будет оптимизирована большинством компиляторов, поскольку в третьем выражении цикла For отсутствуют побочные эффекты.