Думаю, все, кто хотя-бы делает вид, что программирует под iPhone, знают, что Objective-C — это надстройка на C. Тем не менее, объекты, начинающиеся с NS* порой производят на программистов неизгладимое впечатление, и они начинают использовать классы библиотек не по их прямому назначению, получая при этом излишки съеденной памяти да и просто геморрой при программировании.
В одном из форумов я встретил такой вопиющий код:
hitBoxArray = [[NSMutableArray alloc] init]; NSArray *boxes = [NSArray arrayWithObjects: @"{{64,404},{48,48}}", @"{{112,404},{48,48}}", @"{{160,404},{48,48}}", @"{{208,404},{48,48}}", @"{{64,356},{48,48}}", @"{{112,356},{48,48}}", @"{{160,356},{48,48}}", @"{{208,356},{48,48}}", @"{{64,308},{48,48}}", @"{{112,308},{48,48}}", @"{{160,308},{48,48}}", @"{{208,308},{48,48}}", @"{{64,260},{48,48}}", @"{{112,260},{48,48}}", @"{{160,260},{48,48}}", @"{{208,260},{48,48}}", nil];
CGRect aRect; HitBoxRect *hRect; for (int i = 0; i < [boxes count]; i++) { aRect = CGRectFromString([boxes objectAtIndex:i]); hRect = [[HitBoxRect alloc] initWithCGRect:aRect]; [hitBoxArray addObject:hRect]; [hRect release]; }
Т.е. перец смекнул, что создать NSArray структур, коими являются CGRect-ы у него не получится, поэтому, хох, будем создавать NSArray со строками, а потом преобразовывать в CGRect. Как только у себя в коде вы начинаете наблюдать такую вермишель — это верный признак того, что что-то вы делаете не так. Время остановиться и подумать.
А ведь если CGRect — это С-шная структура, так почему бы не воспользоваться обычным С-шным массивом для хранения нескольких ее экземпляров? Также например, ширина х высота у него неизменны, а повторяется каждый раз. От всего этого можно и нужно избавляться.
Вот как выглядит аналогичный момент у меня в коде:
#import "PresetViewController.h"
#define FRAME_WIDTH 75 #define FRAME_HEIGHT 75
#define FRAME_COL_COUNT 3 #define FRAME_ROW_COUNT 4
static int frameColumns[] = { 22, 124, 223 }; static int frameRows[] = { 29, 128, 227, 326 };
@implementation PresetViewController
...
- (void)viewDidLoad {
[super viewDidLoad];
for (int row = 0; row < FRAME_ROW_COUNT; row++) { for (int col = 0; col < FRAME_COL_COUNT; col++) {
CGRect frame = CGRectMake(frameColumns[col], frameRows[row], FRAME_WIDTH, FRAME_HEIGHT); UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; [self.view addSubview:imageView]; [imageView release]; } } }
@end
Сразу чувствуется разница, что вы гладите по шерсти, а не против. Так что не «забывайма» про С при программировании под iPhone. Порой это может сильно упростить вещи.
. . . . . . . Букмекерская контора принимает ставки на спортивные события с высокими коэффициентами и лимитами на фаворитов. Футбол, теннис, баскетбол, хоккей и даже ... А если вы любитель казино - тогда и эту слабость мы сможем удовлетворить. . . . . . В течение последних лет мы поддерживаем для Вас базу всех актуальных предложений аренды офиса в Москве. В ней содержится максимально полный список арендных помещений. 100% гарантия нахождения помещения для вас в кратчайшие сроки. |