Функция alloca великолепна, и все скептики просто распространяют FUD.
void foo()
{
int x = 50000;
char array[x];
char *parray = (char *)alloca(x);
}
Массив и parray точно такие же, с точно такими же рисками. Сказать, что один лучше другого - это синтаксический, а не технический выбор.
Что касается выбора переменных стека по сравнению с переменными кучи, есть много преимуществ для долгосрочных программ, использующих стек поверх кучи для переменных с продолжительностью жизни в области. Вы избегаете фрагментации кучи и можете избежать увеличения пространства процесса за счет использования неиспользуемого (непригодного) пространства кучи. Вам не нужно убирать это. Вы можете контролировать выделение стека в процессе.
Почему это плохо?
В Cocoa Touch (но не в Cocoa) CGPoints могут быть обернуты и развернуты с помощью
+ (NSValue *)valueWithCGPoint:(CGPoint)point
- (CGPoint)CGPointValue
NSValues могут быть сохранены в NSDictionary, переданном как параметр userinfo.
Например:
NSValue* value = [NSValue valueWithCGPoint:mypoint];
NSDictionary* dict = [NSDictionary dictionaryWithObject:value forKey:@"mypoint"];
] И в вашем уведомлении:
NSValue* value = [dict objectForKey:@"mypoint"];
CGPoint newpoint = [value CGPointValue];
Объект userinfo, переданный вместе с уведомлением, является просто NSDictionary. Вероятно, самый простой способ передать CGPoint в пользовательской информации - заключить координаты X и Y в NSNumbers с помощью -numberWithFloat :. Затем вы можете использовать setObject: forKey: