четверг, 30 апреля 2009 г.

Полезные мелочи. Генератор случайных чисел

Иногда нужно получить случайное число. Для этого в objective-C есть 2 функции rand() и random() Однако они каждый раз при запуске будут выдавать одну и ту же последовательность псевдо-случайных чисел.

Поэтому если нужна действительно случайная последовательность, то можно привязываться к текущей дате

Этот код выдаёт случайное число в диапазоне (startVal : endVal) - не включая endVal.

srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
int randomValue = startVal+ (random() % (endVal - startVal));

 

среда, 29 апреля 2009 г.

Работа со свойствами (property) c помощью KVM

Как вам наверняка известно, Objective-C позволяет быстро создавать сеттеры и геттеры с помощью директив @property и @synthesize

Однако главное на мой взгляд достоинство этих @property в возможностях, представляемых механизмом Key-Value-Mechanisms Об этих возможностях чуть поподробнее:

Имеем класс

@interface ClassWithProperties
...
@property int integerProperty;
@property id idProperty;
@property NSString *strProperty;

 

1. Доступ к свойствам по их имени во время выполнения программы. Имя свойства может быть неизвестно на этапе компиляции и вычисляться только после старта. Обратите внимание, что метод работает только с наследниками NSObject И поэтому примитивные типы должны быть преобразованы в NSValue и NSNumber Обратное преобразование механизм property делает сам автоматически

ClassWithProperties *cl;
 [cl setValue: [NSNumber numberWithInt: 10] forKey: @"integerProperty"];
 [cl setValue: self forKey: @"idProperty"];
 [cl setValue: @"just a string" forKey: @"strProperty"];
 ......
 int i = [[cl valueForKey: @"integerProperty"] intValue];
 NSString *s = [cl valueForKey: @"strProperty"];

2. Иногда  возникает необходимость формировать свойства на этапе выполнения. Чтоб пользователь мог обратиться к 

[cl setValue: @"someValue" forKey: @"AnyNameAsYouWant"]; и  [cl valueForKey: @"AnyNameAsYouWant"];

даже если на этапе компиляции это имя "AnyNameAsYouWant" неизвестно.  Тут на помощь приходят методы NSObject(void)setValue:(id)value forUndefinedKey:(NSString *)key и  (id)valueForUndefinedKey:(NSString *)key переопределив эти методы мы получим возможность сохранять и полученные значения например в NSMutableDictionary.

3. Получение имен всех свойств. Если мы хотим получить значения всех  property класса (например чтобы их сохранить при выходе), то нам нужно сперва получить все имена, а потом через valueForKey можно будет вытащить и значения. Имена всех свойств класса получаются так:

 #import "objc/runtime.h" ........................
 unsigned int outCount;
 objc_property_t *properties = class_copyPropertyList([AnyClassThatYouWant class], &outCount);
 for(int i = 0; i < outCount; i++)
 {
     objc_property_t property = properties[i];
     const char *propName = property_getName(property);
     if(propName)
     {
        NSString *name = [NSString stringWithUTF8String:propName];
       NSLog(name);  
     }
 }
free(properties);



Внимание! подобным образом нельзя получить свойства, которые были объявлены в суперклассе. Если Вам нужны действительно ВСЕ свойства, то есть [NSobject superclass];

метод с переменным числом аргументов

Иногда необходимо создать метод, который будет принимать неизвестное число однотипных аргументов (Как например [NSString stringWithFormat]). 

Сделать это несложно.

Объявление метода:

-(void) multiArgsMeth: (int)agr0, ...;

Реализация метода:

-(void) multiArgsMeth: (id)agr0, ...{

va_list argumentList;
 va_start(argumentList, arg0); // Start scanning for arguments after firstObject.
 while (parType = va_arg(argumentList, id)) // As many times as we can get an argument of type "id"
 {
 //DO what yo want
 } 
  va_end(argumentList);
}

Вызов метода (не забудьте про nil в конце):

[self multiArgsMeth : myArg0 , myArg1, myArg2 , nil];

вторник, 28 апреля 2009 г.

Полезные мелочи. Работа со строками

Для того, чтобы увидеть логи, необходимо выбрать Run => Console в Xcode.

NSLog(@"log: %@ ", stringValue);
NSLog(@"log: %f ", floatValue);  
NSLog(@"log: %d ", intValue);
 

Работа NSLog() очень похожа на С-шный printf()

----------------------------------------------------------------------------------
Конвертация NSInteger в NSString
NSString *str = [NSString stringWithFormat @"%d", integerValue];

Конвертация NSString в NSInteger
NSInteger intVal = [str integerValue];

----------------------------------------------------------------------------------------------------------------------



Полезные iPhone ссылки

Итак. Программы для iPhone пишутся на языке objective-C.

Англоязычных форумов, книг и документации по разработке приложений для iPhone в сети немало. Тут не о них.

Русскоязычных материалов для разработчика iPhone приложений не очень много.

1. Для начинающих iPhone разработчиков есть очень неплохая статья на Wikipedia

2. Пожалуй лучший русскоязычный ресурс для начинающих Pyobjc.ru Тут же есть и вяло шевелящийся форум

3. Довольно оживленный форум, где собираются русскоязычные Objective-C программисты на Iphones.ru Единственный известный мне ресурс, который хоть как-то обновляется

4. Еще один довольно интересный блог

5.  Еще одна интересная статья

6. Да пожалуй и нет шестого пункта.... Все остальное либо совсем мертвое, либо копипаст с этих. Впрочем если знаете что-то еще - добро пожаловать в комменты

Добавлено намного позже:   Вот появился еще один интересный ресурс - lookapp.ru