Показаны сообщения с ярлыком Class. Показать все сообщения
Показаны сообщения с ярлыком Class. Показать все сообщения

2 июн. 2014 г.

Советы и Рекомендации: Протоколы

Бывает такая штука в протоколах как необязательные / опциональные методы @optional. При работе с объектами/классами, особенно в больших проектах, заведомо не знаешь реализован тот или иной необязательный метод в классе, например, другим разработчиком класса. При компиляции проекта, компилятор не укажет на это даже в варнингах (warnings). После запуска приложения и обработке входящих объектов, в которых из них не будет реализации опциональных методов, естественно приложение упадет. Для проверки реализации опционального метода в классе/объекте рекомендуется использовать селекторы, т.е. вся отвественность ложиться на разработчика:

[objectName respondToSelector:@selector(protocolMethodName)]

т.е. здесь мы проверяем реализован ли в объекте/классе objectName метод описанный в протоколе protocolMethodName. Результат булевый YES | NO.

Как узнать, использует ли объект/класс протокол (подключен ли протокол)?:

[objectName conformsToProtocol:@protocol(protocolName)]

Результат булевый YES | NO.

3 мая 2014 г.

NSMutableString - пример

Класс NSString используется для хранения строк, но в нем присутствует небольшой недостаток. Мы не можем изменять строку которая хранится в экземпляре этого класса. С этой проблемой очень хорошо справляется класс NSMutableString. У него намного больше возможностей обработки строк в отличии от NSString.

Рассмотрим небольшой пример:
Создадим экземпляр класса NSMutableString.

NSMutableString *stringOne = [NSMutableString initWithCapacity: 15];
NSMutableString *stringTwo = [[NSMutableString alloc] initWithCapacity: 30];

В первом и втором примере мы создаем экземпляр класса с выделением под строку определенное количество символов (15 и 30). Второй пример характерен тем, что, мы сами контролируем процесс выделения и очистки памяти. Что произойдет если мы к выделенному количеству символов добавим еще некое количество и случайно выйдем за пределы выделенного количества символов? Ничего не произойдет. Приложение будет и дальше работать также само. Этот параметр носит характер оптимизации для компилятора по выделении памяти и значение этого параметра никак не влияет на длину строки.

По-практикуем:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        NSMutableString *mtStr = [[NSMutableString alloc] initWithCapacity:15];
        [mtStr appendString:@"— Будете у нас, на Колыме – милости просим!"];
        NSLog(@"%@", mtStr);
        
        [mtStr appendFormat:@" — Нет,%@", @" уж лучше вы к нам!"];
        NSLog(@"%@", mtStr);
        
        NSRange strRng = [mtStr rangeOfString:@" — Нет,"];
        [mtStr deleteCharactersInRange:strRng];
        NSLog(@"%@", mtStr);
        
        //[mtStr insertString:@" - Да" atIndex:43];
        //NSLog(@"%@", mtStr);
        
        [mtStr insertString:@" - Да" atIndex:strRng.location];
        NSLog(@"%@", mtStr);
        
        [mtStr setString:@"Новая строка"];
        NSLog(@"%@", mtStr);
    }
    return 0;
}

Результат выполнения:


29 апр. 2014 г.

Категории - теория и пример

Язык Objective-C обладает возможностью добавлять новые методы к уже существующим классам (т.е. расширение функциональности класса). При этом не требуется исходников класса и добавленные методы автоматически становятся доступными всем классам, унаследованным от изменяемого. Так можно добавить новый метод классу NSString (возьмем за пример) и этот метод автоматически добавится во все остальные классы.

Механизм, позволяющий расширять уже существующие классы (путем добавления новых методов, новые instance-переменные добавить таким образом нельзя), называется категорией.

Категория имеет свое имя, список методов и имя класса, который она расширяет. Описание категории имеет следующий вид:

#import "ClassName.h"
@interface ClassName (CategoryName)
  // объявление методов
@end

Реализация категории выглядит следующим образом:

#import "CategoryName.h"
@implementation ClassName (CategoryName)
  // реализация методов
@end

Ограничения при создании категорий:
- Невозможность добавления переменных;
- Возможная коллизия имен с самим классом, поэтому необходимо использовать оригинальные префиксы в наименовании своих методов.

Пример.
Расширим класс NSString, добавим метод который будет проверять является ли файл аудио-файлом. Создадим проект Foundation и добавим в проект новый класс-категорию NSStringAudioExtension (наследуемый от NSString):


Объявим в NSStringAudioExtension.h метод - (BOOL) isAudioFile:

#import <Foundation/Foundation.h>

@interface NSString (NSStringAudioExtension)

- (BOOL) isAudioFile;

@end

В NSStringAudioExtension.m реализуем метод:

#import "NSString+NSStringAudioExtension.h"

@implementation NSString (NSStringAudioExtension)

- (BOOL) isAudioFile {
    
    if ([self hasSuffix:@".mp3"] || [self hasSuffix:@".wav"] || [self hasSuffix:@".arm"]) {

        return YES;

    }
    
    return NO;
}

@end

Дальше возвращаемся в main.m (технически класс NSString должен подхватить его расширение):

#import <Foundation/Foundation.h>
#import "NSString+NSStringAudioExtension.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        NSString *audioFileStr = @"Scooter feat. Vicky Leandros - C'est Bleu.mp3";
        
        if ([audioFileStr isAudioFile]) {
            
            NSLog(@"Да, это аудио-файл");
            
        } else {
            
            NSLog(@"Нет, это не аудио-файл");
            
        }
        
    }
    return 0;
}

Результат выполнения приложения:


Заменим .mp3 на .mp4, результат выполнения:


1 апр. 2014 г.

NSFileManager, NSFileHandle и NSData классы (миниобзор)

Foundation Framework предоставляет три класса, которые необходимы, для работы с файлами и каталогами:

Класс NSFileManager может быть использован для выполнения основных операций с файлами и каталогами, такие как создание, перемещение, чтение и запись файлов, чтение и установка атрибутов файла. Кроме того, этот класс предоставляет методы для  других задач, среди которых выявление текущего рабочего каталога, изменения в новом каталоге, создание каталогов и список содержимого каталога.

Класс NSFileHandle предоставляется для выполнения операций с файлами более низкого уровня, таких как извлечение с определенной позиции в файле (курсор), читать и писать содержимое файла на указанное количество байт, добавление данных в существующий файл.

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

23 февр. 2014 г.

NSDistantObjectRequest - обработка вызовов между процессами

Объекты класса NSDistantObjectRequest используются системой распределенных объектов для обработки вызовов между различными процессами. Эти объекты никогда не следует создавать напрямую. Если вы хотите получить доступ к низкоуровневым деталям распределенных объектов, никогда не следует использовать для этого NSDistantObjectRequest. Для перехвата и обработки запросов вручную следует реализовать делегатный метод handleRequest класса NSConnection.

Методы класса

Получение информации о запросе

НазваниеОписание
- connectionВозвращает объект NSConnection, участвующий в запросе.
- conversationВозвращает объект-токен, представляющий разговор, в котором был создан текущий объект.
- invocationВозвращает объект NSInvocation для запроса.

Выбрасывание удалённого исключения


НазваниеОписание
- replyWithException:Отправляет ответ обратно на удаленный объект, создавая запрос к удалённому объекту.

NSDistantObject

21 февр. 2014 г.

NSDistantObject - прокси для объектов

Класс NSDistantObject является конкретным подклассом класса NSProxy, который определяет прокси для объектов в других приложениях или потоках. Когда удалённый объект получает сообщение, в большинстве случаев сообщение перенаправляется через объект NSConnection к реальному объекту в другом приложении. При этом возвращаемое значение доставляется отправителю сообщения, или он получает исключение от вызываемого метода. NSDistantObject определяет методы для создания экземпляров класса NSConnection, но они предназначены только для для переопределения в подклассах — вы никогда не должны вызывать их напрямую.
Методы класса

Создание локального прокси

Название
Описание
+ proxyWithLocal:connection:
Возвращает локальный прокси для заданного объекта и связи, создавая прокси при необходимости.
- initWithLocal:connection:
Инициализирует объект NSDistantObject как локальный прокси для заданного объекта.

Создание удаленного прокси

Название
Описание
+ proxyWithTarget:connection:
Возвращает удаленный прокси для заданного объекта и связи, создавая прокси при необходимости.
- initWithTarget:connection:
Инициализирует вновь созданные NSDistantObject как удаленный прокси для удалённого объекта, который является идентификатором в другом потоке или другом приложении.

Получение объекта NSConnection для прокси

Название
Описание
- connectionForProxy
Возвращает соединение, используемое текущим объектом.

Настройка протокола прокси

Название
Описание
- setProtocolForProxy:
Задает методы, которые могут быть вызваны текущим объектом в виде протокола.

18 февр. 2014 г.

NSCache контейнер - кэш

Объект NSCache является контейнером или кэшем, который хранит пары “ключ-значение”, аналогично классу NSDictionary. Разработчики часто используют кэши для временного хранения объектов, создание которых является дорогостоящим. Повторное использование этих объектов может обеспечить повышение производительности, потому что их значения не должны быть пересчитаны. Однако, эти объекты не являются критическими для приложения и могут быть удалены, если память ограничена. Если такие объекты удалить, их значения нужно вычислить заново, когда это необходимо.
Пока пара ключ-значение в кэше, кэш поддерживает сильную ссылку на него. Общие типы данных, хранящиеся в объектах NSCache — это объекты, которые реализуют протокол NSDiscardableContent. Хранение объектов этого типа в кэше имеет преимущества, поскольку их содержимое может быть удалено, если они больше не нужны, что приводит к экономии памяти. По умолчанию объекты, реализующие NSDiscardableContent, автоматически удаляются из кэша, если их содержимое удаляется, хотя эта политика автоматического удаления могут быть изменена.
Объекты NSCache имеют несколько отличий от других изменяемых коллекций. Класс NSCache включает в себя различные политики автоматического удаления, обеспечивающие использование не слишком большого количества памяти системы. Система автоматически осуществляет эти политики, если память необходима другим приложениям. При вызове эти политики удаляют некоторые элементы из кэша, сводя к минимуму использование памяти. Вы можете добавлять, удалять и запрашивать элементы из кэша из разных потоков без необходимости блокировки кэша. В отличие от объекта NSMutableDictionary, кэш не копирует ключевые объекты, добавленные в него.
Методы класса
Изменение имени кэша

Название
Описание
- name
Возвращает имя кэша.
- setName:
Устанавливает имя кэша из заданной строки.

Получение кэшированных значений


Название
Описание
- objectForKey:
Возвращает значение, связанное с указанным ключом.

Добавление и удаление кэшированных значений



Название
Описание
- setObject:forKey:
Устанавливает значение указанного ключа в кэше.
- setObject:forKey:cost:
Устанавливает значение указанного ключа в кэше и связывает пару ключ-значение с указанной стоимостью.
- removeObjectForKey:
Удаляет значение из кэша по указанному ключу.
- removeAllObjects
Очищает кэш, удалив все объекты.
Управление размером кэша


Название
Описание
- countLimit
Возвращает максимальное количество объектов, которые в настоящее время может содержать кэш.
- setCountLimit:
Задаёт максимальное число объектов, которое кэш может содержать.
- totalCostLimit
Возвращает максимальную общую стоимость, которую может иметь кэш до начала вытеснения объектов.
- setTotalCostLimit:
Задаёт максимальную общую стоимость, которую может иметь кэш до начала вытеснения объектов.

Управление удаляемым содержимым


Название
Описание
- evictsObjectsWithDiscardedContent
Возвращает логическое значение, указывающее, будет ли кэш автоматически вытеснять объекты, содержимое которых было удалено.
- setEvictsObjectsWithDiscardedContent:
Устанавливает логическое значение, указывающее, будет ли кэш автоматически вытеснять объекты, содержимое которых было удалено.

Управление делегатом

Название
Описание
- delegate
Возвращает делегат кэша.
- setDelegate:
Устанавливает заданный объект делегатом кэша.

17 февр. 2014 г.

NSArchiver кодирование объектов

Класс NSArchiver, конкретный подкласс NSCoder, предоставляет способ для кодирования объектов в архитектурно независимый формат, который может храниться в файле. Объект класса NSArchiver сохраняет архивные данные в изменяемый объект данных, объект класса NSMutableData. После кодирования объектов, объект NSArchiver может записать этот изменяемый объект данных непосредственно в файл, или можно использовать эти данные по-другому. Класс NSUnarchiver служит для декодирования объектов из объектов, хранящих данные. В Mac OS X v10.2 и более поздних версиях, NSArchiver и NSUnarchiver были заменены NSKeyedArchiver и NSKeyedUnarchiver.

Методы класса:

Инициализация NSArchiver


Название
Описание
- initForWritingWithMutableData:
Возвращает архиватор, инициализированный для кодирования потока и сведений о версии в указанный объект изменяемых данных.

Архивирование данных

Название
Описание
+ archivedDataWithRootObject:
Возвращает объект данных, содержащий закодированную форму графа объектов для заданного корневого объекта.
+ archiveRootObject:toFile:
Создает временный экземпляр NSArchiver и архивирует граф объектов при помощи кодирования в объект данных и записи результирующего объекта данных в указанный файл.
- encodeRootObject:
Архивирует заданный объект, а также все объекты, к которым он подключен.
- encodeConditionalObject:
Условно архивирует заданный объект.

Получение архивных данных


Название
Описание
- archiverData
Возвращает архивные данные текущего объекта.

Замена классов или объектов


Название
Описание
-classNameEncodedForTrueClassName:
Возвращает имя класса, используемого для архивирования экземпляров класса с правильным заданным именем.
- encodeClassName:intoClassName:
Кодирует заменяющее имя для класса с заданным правильным именем.
- replaceObject:withObject:
Позволяет текущему архиверу закодировать заданный объект так, как будто бы он является другим заданным объектом.

16 февр. 2014 г.

NSAffineTransform аффинные преобразования


Класс NSAffineTransform предоставляет методы для создания, объединения и применения аффинных преобразований. Преобразование определяет, как точки в одной системе координат трансформируются в точки в другой системе координат. Аффинное преобразование — особый тип преобразования, которое сохраняет параллельные линии в трансформируемом контуре, но не обязательно сохраняет длины или углы. Масштабирование, вращение и перенос являются наиболее часто используемыми действиями, поддерживаемыми аффинными преобразованиями, но также возможен и сдвиг объектов.
Методы класса:

Создание объекта NSAffineTransform
Название
Описание
+ transform
Создает и возвращает новый объект NSAffineTransform инициализированный единичной матрицей.
- initWithTransform:
Инициализирует матрицу текущего объекта с помощью другого объекта transform и возвращает текущий объект.

Накопительные преобразования

Название
Описание
- rotateByDegrees:
Применяет коэффициент поворота (измеряется в градусах) к матрице преобразования текущего объекта.
- rotateByRadians:
Применяет коэффициент поворота (измеряется в радианах), к матрице преобразования текущего объекта.
- scaleBy:
Применяет указанный коэффициент масштабирования для осей x и y к матрице преобразования текущего объекта.
- scaleXBy:yBy:
Применяет коэффициенты масштабирования для каждой оси матрицы преобразования текущего объекта.
- translateXBy:yBy:
Применяет указанный коэффициент переноса к матрице преобразования текущего объекта.
- appendTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- prependTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- invert
Инвертирует матрицу текущего объекта.

Преобразование данных и объектов

Название
Описание
- transformPoint:
Применяет преобразование текущего объекта к указанному объекту NSPoint и возвращает результаты.
- transformSize:
Применяет преобразование текущего объекта к указанному объекту NSSize и возвращает результаты.

Доступ к структуре трансформации


Название
Описание
- transformStruct
Возвращает матричные коэффициенты, хранящиеся в матрице текущего объекта.
- setTransformStruct:
Заменяет значения коэффициентов матрицы преобразования текущего объекта указанными значениями.