Допустить ошибку...
пробуют метод:
std::vector<T>::reserve(x)
Это позволит Вам зарезервировать достаточно памяти для x объектов, не инициализируя никого (Ваш вектор все еще пуст). Таким образом не будет перераспределения до для осмотра x.
, вторая точка - то, что вектор не инициализирует значения для обнуления. Вы тестируете свой код в отладке?
После проверки на g ++, следующий код:
#include <iostream>
#include <vector>
struct MyStruct
{
int m_iValue00 ;
int m_iValue01 ;
} ;
int main()
{
MyStruct aaa, bbb, ccc ;
std::vector<MyStruct> aMyStruct ;
aMyStruct.push_back(aaa) ;
aMyStruct.push_back(bbb) ;
aMyStruct.push_back(ccc) ;
aMyStruct.resize(6) ; // [EDIT] double the size
for(std::vector<MyStruct>::size_type i = 0, iMax = aMyStruct.size(); i < iMax; ++i)
{
std::cout << "[" << i << "] : " << aMyStruct[i].m_iValue00 << ", " << aMyStruct[0].m_iValue01 << "\n" ;
}
return 0 ;
}
дает следующие результаты:
[0] : 134515780, -16121856
[1] : 134554052, -16121856
[2] : 134544501, -16121856
[3] : 0, -16121856
[4] : 0, -16121856
[5] : 0, -16121856
инициализация, которую Вы видели, была, вероятно, артефактом.
[РЕДАКТИРОВАНИЕ] После комментария изменяют размеры, я изменил код для добавления изменять размеры строки. Изменение размеры эффективно называет конструктора по умолчанию объекта в векторе, но если конструктор по умолчанию ничего не делает, то ничто не инициализируется... Я все еще полагаю, что это был артефакт (мне удалось в первый раз обнулить целый вектор со следующим кодом:
aMyStruct.push_back(MyStruct()) ;
aMyStruct.push_back(MyStruct()) ;
aMyStruct.push_back(MyStruct()) ;
Так...:-/
[уже РЕДАКТИРУЮТ 2] Как предложенный Arkadiy, решение состоит в том, чтобы использовать встроенного конструктора, берущего желаемые параметры. Что-то как [1 114]
struct MyStruct
{
MyStruct(int p_d1, int p_d2) : d1(p_d1), d2(p_d2) {}
int d1, d2 ;
} ;
Это будет, вероятно, встроено в Вашем коде.
, Но необходимо так или иначе изучить код с профилировщиком, чтобы быть уверенными, что эта часть кода является узким местом приложения.
Да, это возможное. Для этого вам нужно использовать MKAnnotationView вместо MKPinAnnotationView. и не используйте свойство annotation.animatesDrop.
Вот пример кода, который вы можете использовать в viewForAnnotation,
annotation = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"try"];
annotation.canShowCallout = YES;
annotation.image = [UIImage imageNamed:@"image.png"];
return annotation;