Comments 30
Спасибо! Хотя тут сплошные синглтоны, но для быстрой разработки маленьких проектов пойдет — я сам так делал.
Снипет для синглтону сразу режет глаз. Уже давно пользуюсь потокобезопасным определением синглтона через GCD:
Снипет для синглтону сразу режет глаз. Уже давно пользуюсь потокобезопасным определением синглтона через GCD:
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
Но в таком случае разве объект не будет обнуляться с каждым вызовом sharedManager?
Можно изменить Singleton.m следующим образом:
Можно изменить Singleton.m следующим образом:
<...>
@implementation Singleton
static Singleton *sharedSingleton;
+ (Singleton *)sharedSingleton {
if (sharedSingleton == nil) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedSingleton = [[Singleton alloc] init];
});
}
return sharedSingleton;
}
<...>
static же.
Спасибо за пояснение! Почитал про static, все стало понятно :)
Поправил текст статьи, плюсанул в карму :)
Поправил текст статьи, плюсанул в карму :)
И так можно.
Где-то в includes.h
Потом там, где нужно
Где-то в includes.h
// macros for singletone creation
#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \
static dispatch_once_t pred = 0; \
__strong static id _sharedObject = nil; \
dispatch_once(&pred, ^{ \
_sharedObject = block(); \
}); \
return _sharedObject; \
Потом там, где нужно
#pragma mark - get Instance
+(ILStateManager *)sharedManager
{
DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
return [[ILStateManager alloc] init];
});
}
Продолжайте делиться опытом!
Хоть для меня новое было только MKStoreKit (еще не работал с микротранзакциями), но все же, может еще что нибудь новое увижу.
Хоть для меня новое было только MKStoreKit (еще не работал с микротранзакциями), но все же, может еще что нибудь новое увижу.
Это все конечно интересно, но Вы лучше расскажите о фрилансе. Где и как Вы находите клиентов? На сколько они адекватные? Какие подводные камни в ремесле фрилансера к контексте iOS/MacOS разработчика и т.п.
Интересный комментарий :)
Работаю на elance.com, клиентура пока что только там. Все абсолютно адекватные, пичкают бонусами и платят хорошие деньги (а может это просто я так работаю). Подводные камни? Думаю, такие же, как и во всех других сферах фриланса :) Порой сложно работать дома. Если хорошо знать свое дело, деньги будут :)
Работаю на elance.com, клиентура пока что только там. Все абсолютно адекватные, пичкают бонусами и платят хорошие деньги (а может это просто я так работаю). Подводные камни? Думаю, такие же, как и во всех других сферах фриланса :) Порой сложно работать дома. Если хорошо знать свое дело, деньги будут :)
Спасибо за информацию. Видел Ваш профайл на elanсe. А еще такие моменты интересны — железо (мак мини, хакинтош и т.п.), девайсы (iPhone, iPad и т.п.), Apple Developer Program, сколько часов в неделю работаете, уровень английского (я надеюсь не с СНГ работаете), сколько уходит времени на поиск заказчиков?
Macbook Air 2012, iPhone 5, iPad Mini. Лицензия на разработку есть. Работаю примерно 25 часов в неделю, час стоит $20. Уровень английского оцениваю как высокий, учусь в UBC. На поиск заказчиков уходит 1-2 дня.
Бесценно! Спасибо еще раз. Air хватает? Я думал подтармаживать будет…
Подтормаживает иногда, но утилита «Free Memory» спасает.
Поделись, какие фреймворки используешь, кроме cocos2d и box2d если используешь их )
Можешь написать о сроке реализации своих проектов?
Тоже хотел фрилансить, но пока боюсь ) с одной стороны в фрилансе свобода, с другой стороны, работая на дядю есть стабильная зарплата.
Можешь написать о сроке реализации своих проектов?
Тоже хотел фрилансить, но пока боюсь ) с одной стороны в фрилансе свобода, с другой стороны, работая на дядю есть стабильная зарплата.
Работая на дядю есть и «стабильный пендаль», которого нету когда работаешь дома. Для меня вот это более важно. :)
Какие придется, такие и использую :) А так, разобраться в различных фреймворках типа PSPDFKit или Phonegap не состовляет трудности.
Срок реализации зависит от задачи. Я сам себе дядя с пендалем
Срок реализации зависит от задачи. Я сам себе дядя с пендалем
Хороший пост, жду продолжения :)
Скажите, а вы слышали о такой вещи как Объектно-Ориентированное Программирование?
Любитель религиозных войн?
Можете указать на ошибки в моем ООП-фу?
Все ваши магические строки прекрасно прячутся в *.m файл класса в котором инкапсулируется вся логика (чтение, запись, etc.)
Кроме того, не понимаю зачем использовать словари для хранения настроек, если можно создать полноценный класс, с пачкой методов, а внутри спрятать логику, опять таки. Может быть в будущем вы решитесь использовать NSUserDefaults, вместо велосипеда с файлами.
Singleton — это скорее антипаттерн, чем паттерн приносящий пользу. Какой смысл создавать объекты которые используются пару раз, а висят в памяти постоянно? Если вам нужно из сотни мест достучаться до одного и того же объекта, то возможно у вас косяк в архитектуре.
Ну и дефайны. Зачем? Чем вас не устраивают константы?
Кроме того, не понимаю зачем использовать словари для хранения настроек, если можно создать полноценный класс, с пачкой методов, а внутри спрятать логику, опять таки. Может быть в будущем вы решитесь использовать NSUserDefaults, вместо велосипеда с файлами.
Singleton — это скорее антипаттерн, чем паттерн приносящий пользу. Какой смысл создавать объекты которые используются пару раз, а висят в памяти постоянно? Если вам нужно из сотни мест достучаться до одного и того же объекта, то возможно у вас косяк в архитектуре.
Ну и дефайны. Зачем? Чем вас не устраивают константы?
Учту, спасибо.
1. NSUserDefaults использую обычно, но здесь была просто прихоть клиента — использовать plist файлы. Плюс любую настройку клиент мог сам изменить в папке документов приложения.
2. Ох уж этот постоянный холливар насчет синглтонов :) иногда это хорошее решение для архитектуры, иногда нет.
3. Дефайны, константы, компилятору же все равно, разве нет? Поправьте, если я не прав. А клиенту проще видеть привычные #define в своем проекте.
4. Магические строки использованы исключительно для упрощения примеров. При желании, программист сам от них избавится.
1. NSUserDefaults использую обычно, но здесь была просто прихоть клиента — использовать plist файлы. Плюс любую настройку клиент мог сам изменить в папке документов приложения.
2. Ох уж этот постоянный холливар насчет синглтонов :) иногда это хорошее решение для архитектуры, иногда нет.
3. Дефайны, константы, компилятору же все равно, разве нет? Поправьте, если я не прав. А клиенту проще видеть привычные #define в своем проекте.
4. Магические строки использованы исключительно для упрощения примеров. При желании, программист сам от них избавится.
1. Можно использовать [NSUserDefaults registerDefaults:[NSDictionary dictionaryWithContentsOfURL:configurationSettingsFileURL]]
3. define можно передефайнить или сделать undef, а константу — нет
3. define можно передефайнить или сделать undef, а константу — нет
Хорошо, а если более предметно? Что именно в коде не так?
Как фрилансер, думаю сюда надо добавить ещё CocoaPods, очень удобная вещь во многих смыслах и, в частности, в вопросе переиспользумого кода.
[removed double comment]
Sign up to leave a comment.
Записки iOS разработчика: Делимся опытом, часть 1