NSRegularExpression sample for comment syntax highlighting

I have this text:

1
word1 word2 " word3 //" word4

I wrote simple solution. I know it can be better. I know about Back Reference, but i don’t have experience with it.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"((@\"|\").*?(\"))"
                                          options:NSRegularExpressionDotMatchesLineSeparators
                                            error:nil];
NSArray *textArray = [expression matchesInString:textString options:0 range:NSMakeRange(0, [textString length])];

for (NSTextCheckingResult *result in textArray) {
    // set color for range
}


// Comments
expression = [NSRegularExpression regularExpressionWithPattern:@"(//[^\"\n]*)"
                                                options:0
                                                error:nil];

NSArray * arrayComments = [expression matchesInString:textString options:0 range:NSMakeRange(0, [textString length])];

for (NSTextCheckingResult *resultComment in arrayComments) {

    BOOL inside = NO;
    for (NSTextCheckingResult *resultText in textArray) {
        NSInteger from = resultText.range.location;
        NSInteger to = resultText.range.location+resultText.range.length;
        NSInteger now = resultComment.range.location;
        if (from < now && now < to) {
            inside = YES;
            break;
        }
    }
    if (!inside) {
        // set color for range
    }
}

Color Picker for iOS

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- (void)viewDidLoad
{
    [super viewDidLoad];
   
    // Do any additional setup after loading the view, typically from a nib.
   
    if (self.cPicker == nil) {
        [self.view setBackgroundColor:[UIColor grayColor]];
        self.cPicker = [[VBColorPicker alloc] initWithFrame:CGRectMake(0, 0, 202, 202)];
        [_cPicker setCenter:self.view.center];
        [self.view addSubview:_cPicker];
        [_cPicker setDelegate:self];
        [_cPicker showPicker];
       
        // set default YES!
        [_cPicker setHideAfterSelection:NO];
    }
     
}

// set color from picker
- (void) pickedColor:(UIColor *)color {
    [_rect setBackgroundColor:color];
    [_cPicker hidePicker];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (![_cPicker isHidden]) {
        [_cPicker hidePicker];
    }
}

// show picker by double touch
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
   
    if (touch.tapCount == 2) {
        [_cPicker setCenter:[touch locationInView:self.view]];
        [_cPicker showPicker];
    }
}

Основы Grand Central Dispatch

В предыдущих статьях писал, что хотел перевести одну интересную статью с английского, но вот нашел перевод  хорошей статьи на русский. Думаю автор перевода не будет против если я копию возьму себе :)

Что это?

Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не parallel, я не знаю нор­маль­но­го пе­ре­во­да, ес­ли кто ска­жет — на­пи­ши­те в ком­мен­та­ри­ях, прим. пер.) про­грам­ма­ми. На са­мом про­стом уровне по­ни­ма­ния, ме­то­до­ло­гия по­хо­жа на NSOperationQueue, ко­то­рая поз­во­ля­ет раз­би­вать про­грам­му на неза­ви­си­мые за­да­чи, ко­то­рые за­пус­кать па­рал­лель­но или по­сле­до­ва­тель­но. GCD ра­бо­та­ет на бо­лее низ­ком уровне, предо­став­ля­ет боль­шую про­из­во­ди­тель­ность и не яв­ля­ет­ся ча­стью Cocoa.

В до­пол­не­ние к сред­ствам па­рал­лель­но­го вы­пол­не­ния ко­да, GCD та­к­же предо­став­ля­ет пол­но­стью ин­те­гри­ро­ван­ную си­сте­му об­ра­бот­ки со­бы­тий. Об­ра­бот­чи­ки мо­гут быть скон­фи­гу­ри­ро­ва­ны та­ким об­ра­зом, что­бы ре­а­ги­ро­вать на со­бы­тия от фай­ло­вых де­скрип­то­ров, си­стем­ных пор­тов и про­цес­сов, тай­ме­ров и сиг­на­лов, и на поль­зо­ва­тель­ские со­бы­тия. Эти об­ра­бот­чи­ки ис­пол­ня­ют­ся па­рал­лель­но при по­мо­щи ин­фра­струк­ту­ры GCD.

API GCD пол­но­стью ос­но­ван на так на­зы­ва­е­мых бло­ках, о ко­то­рых я го­во­рил в преды­ду­щих се­ри­ях от­ве­тов на во­про­сы («Поз­воль­те пред­ста­вить»: бло­ки и «Об­суж­де­ние прак­ти­че­ских ас­пек­тов ис­поль­зо­ва­ния бло­ков в обыч­ном ко­де»). GCD мож­но ис­поль­зо­вать и без бло­ков, при­ме­няя тра­ди­ци­он­ные C-​шные ме­ха­низ­мы ука­за­те­лей на функ­ции и кон­тек­ста, но ис­поль­зо­вать бло­ки го­раз­до про­ще и неве­ро­ят­но удоб­нее с прак­ти­че­ской точ­ки зре­ния.

Для по­лу­че­ния си­стем­ной до­ку­мен­та­ции по GCD, мож­но на­брать man dispatch в ко­манд­ной стро­ке, ес­ли у вас Snow Leopard. Continue reading

Adding SVN revision to Xcode project

Просмотр ревизии в самом приложении предотвращает путаницу и всякие проблемы с отслеживанием текущей версии.

Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта.

1
2
3
4
5
6
7
8
9
10
REVISION=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
APPVERSION=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}`

xported="xported"

if [ $APPVERSION != $xported ]; then
     /usr/libexec/PlistBuddy -c "Delete :CFBundleDisplayVersion" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
     /usr/libexec/PlistBuddy -c "Add :CFBundleDisplayVersion string" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
     /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayVersion $APPVERSION.$REVISION" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
fi

Чтоб добавить скрипт, необходимо выполнить следующие действия:
1. Зажать Ctrl+клик на фаил проекта в дереве проекта
2. Add->New Build Phase -> New Run Script Build Phase
3. Откроется окно в которое нужно вставить скрипт.

Continue reading

Keychain

Это только часть статьи, скопировал с habrahabr.ru. Добавил для себя, но может кому-то пригодится тоже. Спасибо автору youROCK.

Функции для работы с Keychain достаточно низкоуровневые (в отличие от большинства фреймворков, которые работают с пользовательским интерфейсом), и используют API на языке C. В документации от Apple есть очень объемное руководство по всем вызовам, которые поддерживаются подсистемой Keychain Services, но я бы хотел показать, насколько просто можно делать базовые вещи.

При работе с вызовами на языке C, Apple в основном использует CoreFoundation. CoreFoundation использует и поддерживает практически те же самые типы данных, которые используются в Objective C с фреймворком Cocoa, и даже поддерживает прозрачное приведение типов CoreFoundation < -> Cocoa. Все вызовы CoreFoundation имеют префикс CF (ср. с NS), а имена типов получаются с помощью замены NS на CF и звездочки [*] на суффикс Ref (reference, ссылка) в конец (к примеру, NSString* < -> CFStringRef, NSArray* < -> CFArrayRef). Для работы с памятью используются CFRelease(CFTypeRef) / CFRetain(CFTypeRef), о назначении и способе использования которых можете догадаться сами.
Continue reading

Tips and Tricks II

Пара-тройка решений маленьких вопросов…

Таким образом можно проверить наличие API на уставленном устройстве
Check for presence of GKLocalPlayer API.

1
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

Один из варианто проверки версии iOS
The device must be running running iOS 4.1 or later.

1
2
3
4
NSString *reqSysVer = @"4.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer compare:reqSysVer
                              options:NSNumericSearch] != NSOrderedAscending);

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

1
2
3
4
5
6
7
8
9
10
11
12
+ (float) getHeightOfText:(NSString*) text  
                   forFont: (UIFont*)_font  
               withWidtht:(float)width  
                    mode:(UILineBreakMode)lineBreakMode
{
 
  CGSize suggestedSize = [text sizeWithFont:withFont
              constrainedToSize:CGSizeMake(width, FLT_MAX)
                   lineBreakMode:lineBreakMode];
 
 return suggestedSize.height;
}

Example “NSPanel with NSProgressIndicator”

It’s simple.

1. Create NSPanel with indicator in IB
2. Present indicator and launch NSThread with your action method

1
2
3
4
5
6
7
8
9
- (IBAction) push: sender {
     if (panel == nil) {
          panel = [[PanelWithIndicator alloc] init];
     }
     [NSThread detachNewThreadSelector:@selector(launchThread)
     toTarget:self
     withObject:nil];
     [panel withParentWindow:window];  
}

3. End of action and stop indicator

1
2
3
4
5
- (void) stopIndicator {
     [panel performSelectorOnMainThread:@selector(end)
     withObject:nil
     waitUntilDone:YES];
}

Method end in panel object

1
2
3
4
- (void) end {
     [[self window] orderOut:nil];
     [NSApp stopModal];
}

Continue reading

Local Notification Sample Code (OS 4.0 only)

Start a new Window-based Application Project called LocalPush

Add an instance variable bgTask in LocalPushAppDelegate

Download Sample + 2 books “iPhoneMemoryManagementFinalVersion” and “ES 2.0 Programming Guide”

1
2
3
4
@interface LocalPushAppDelegate : NSObject {
    UIWindow *window;
    UIBackgroundTaskIdentifier bgTask;
}

message from background, iphone OS 4.0

It will fire up a Local Notification to remind you one min before the event which is 2 minutes due from now
Continue reading

Эксперемент

Написал простенькую программку ради эксперимента. С помощью программы можно ходит по корневому разделу системы, без Jailbreak. Если кто-то имеет опыт как создать фаил в директории не принадлежащей программе,  без взлома устройства, и поделится! Буду очень признателен!

photo

И собственно сам код

1 2 3 4 Next »