суббота, 31 марта 2012 г.

Доступные шрифты в iphone sdk

Данный вопрос почему-то слабо освещен в документации Apple, но всегда есть выход.
Вот код, который напечатает в dbg-console все доступные шрифты:

    // List all fonts on iPhone
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSArray *fontNames;
    NSInteger indFamily, indFont;
    for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
    {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
        fontNames = [[NSArray alloc] initWithArray:
                     [UIFont fontNamesForFamilyName:
                      [familyNames objectAtIndex:indFamily]]];
        for (indFont=0; indFont<[fontNames count]; ++indFont)
        {
            NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
        [fontNames release];
    }
    [familyNames release];

А вот вывод в XCode 4 IPhone SDK 5.0:

Редактируем шрифт, его цвет и прочие прибамбасы в TabBar

for (UIViewController *tab in rootController.viewControllers)
    {
      [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor blackColor], UITextAttributeTextColor,
         [NSValue valueWithUIOffset:UIOffsetMake(0,0)], UITextAttributeTextShadowOffset,
        [UIFont fontWithName:@"Noteworthy-Light" size:13.0], UITextAttributeFont, nil]
          forState:UIControlStateNormal];
     //
    [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor whiteColor], UITextAttributeTextColor, nil]
          forState:UIControlStateSelected];
    }

Еще раз о работе с памятью в Obj-C


Дело обстоит так:

когда создаешь получаешь объект статическим методом вроде stringWithString, то созданный объект попадает в autorelease pool и его счетчик ссылок обнуляется, когда уничтожается этот пул. Однако система может и сама заретайнить некоторые объекты из пула, когда ей не хватает памяти.

Общее правило таково:

Когда ты создаешь получаешь объект методами, в названии которых есть слова alloc, copy, new и retain, то ТЫ СТАНОВИШЬСЯ ВЛАДЕЛЬЦЕМ ОБЪЕКТА И ТЫ ОТВЕЧАЕШЬ ЗА НЕГО И СВОЕВРЕМЕННЫЙ release. Во всех других случаях, ты не являешься владельцем объекта и не вправе контролировать его retainCount - т.е. делать release.

Хочу заметить, что на один alloc, copy, retain должен приходиться один release! То есть не стоит делать несколько раз release, если retain ты сделал всего один раз. ;)