Objective-C FAQ – часто задаваемые вопросы по Objective-C




Вопрос: Как определить текущую платформу?
Ответы:



Вопрос: Как определить текущая архитектура 32-bit или 64-bit?
Ответ:
#ifdef __LP64__
// 64-bit code
#else
// 32-bit code
#endif

Вопрос: Как объявить статическое свойство в классе?
Ответ:
@interface Model
+ (int) value;
+ (void) setValue:(int)val;
@end

@implementation Model
static int value;
+ (int) value
{ @synchronized(self) { return value; } }
+ (void) setValue:(int)val
{ @synchronized(self) { value = val; } }
@end

Вопрос: Как проверить строку на равенство?
Ответ:
if ([mystring isEqualToString:@"Johns"]){
    //do some stuff in here
}

Вопрос: Как написать статический конструктор?
Ответ:
+ (void) initialize {
  if (self == [MyParentClass class]) {
    // Once-only initializion
  }
  // Initialization for this class and any subclasses
}

Вопрос: Как проверить массив на наличие в нем строки NSString?
Ответ:
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
    if ([someString isEqualToString:yourString]) {
        identicalStringFound = YES;
        break;
    }
}

Вопрос: Как отсортировать массив объектов NSArray?
Ответ:
NSArray sortedArrayUsingComparator Tutorial

Вопрос: Как пользоваться блоками?
Ответ:
Introduction to Objective-C Blocks

Вопрос: Как преобразовать std::string в NSString?
Ответ:
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];


Вопрос: Как перекрыть getter или setter для свойства?
Ответ:
Интерфейс:
@interface Customer
@property (nonatomic) NSString* name;
@end

Реализация:
@implementation Customer

@synthesize name = _name;  //Must do this

//Setter method
- (void) setName:(NSString *)n {
    NSLog(@"Setting name to: %@", n);

    _name = [n uppercaseString];
}
//Getter method
- (NSString*) name {
    NSLog(@"Returning name: %@", _name);
    return _name;
}

- (void) test {
    self.name = @"Joan of arc";
    NSLog(@"Name is %@", self.name);
}

@end


Вопрос: Что означают атрибуты свойств?
Ответ:
http://stackoverflow.com/questions/588866/whats-the-difference-between-the-atomic-and-nonatomic-attributes

Вопрос: Как реализовать конструктор для класса?
Ответ:
- (id)init 
{
    self = [super init];
    if (self) 
    {
        // superclass successfully initialized, further 
        // initialization happens here ...
    }
    return self;
}

Вопрос: Где посмотреть спецификаторы формата?
Ответ:

Вопрос: Как реализовать паттерн "наблюдатель" на Objective-C?
Ответ:

Вопрос: Как работать с потоками?
Ответ:

Вопрос: Как именовать методы в Objective-C?
Ответ:

Вопрос: Как преобразовать NSString в std::string?
Ответ:
// 1
NSString *foo = @"Foo";
std::string *bar = new std::string([foo UTF8String]);

// 2
NSString *foo = @"Foo";
std::string bar([foo UTF8String));

// 3
- (void)exampleMethodWithString:(NSString*)str
{
  // NOTE: if str is nil this will produce an empty C++ string
  // instead of dereferencing the NULL pointer from UTF8String. 
  std::string cpp_str([str UTF8String], [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
  wrapped.ExampleMethod(cpp_str);
}

Вопрос: Почему Interface type cannot be statically allocated?
Ответ:
"Statically allocated" in this case would mean that the memory for that object was allocated at compile-time. All objects in Obj-C, however, are allocated at runtime and accessed through pointers.

Вопрос: Как отправить POST запрос по HTTP?
Ответ:

Вопрос: Как реализовать деструктор для класса?
Ответ:


Вопрос: Как преобразовать целое число в строку?
Ответ:
NSString *number = [[NSString alloc] initWithFormat:@"%d", 123]

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

Вопрос: Как напечатать массив типа char?
Ответ:
            size_t theLen = 1024;
            char theBuf[theLen];
            wrapped.soap_sprint_fault(theBuf, theLen);
            printf("%s\n", theBuf);
            NSLog(@"%s", theBuf);

Вопрос: Что такое @synthesize?
Ответ:
"Команда сокращенного вызова @synthesize предписывает компилятору сгенерировать код, необходимый для доступа к экземплярным переменным."

Automatic Property Synthesis With Xcode 4.4 - Use Your Loaf

Вопрос: Зачем нужны атрибуты объявленных свойств (declared properties)?
Ответ:
"Атрибут nonatomic ускоряет работу акцессора: атомарные свойства нужны только при работе с множественными потоками (threads). Атрибут retain обеспечивает присвоение значения экземплярной переменной в порядке retain-release, а атрибут copy - в порядке copy-release."

Вопрос: Как прочитать приватную переменную класса?
Ответ:
@implementation NSCollectionView (displayedItems)

- (NSMutableArray *)myDisplayedItems
{
    return [self valueForKey:@"displayedItems"];
}

@end


Вопрос: Как вывести в логе наименование функции?
Ответ: NSLog(@"%s:%d", __func__, __LINE__);