About this Blog

This Blog has English posts and Japanese posts. About Mac, iOS, Objective-C, and so on.

2012年11月24日土曜日

メソッドにCの2次元配列の先頭ポインタを渡す

Objective-Cと生のCの繋ぎ目ではいろいろと迷いませんか?
最近ハマったのが、2次元配列のポインタ渡し。

uint8_t twoDimArray[255][3]といった生のCの2次元配列をポインタで受け取りたい場合、以下のようにします。
@interface myClass : NSObject{
  uint8_t (*_twoDimArray)[3];
}

-(void)setTwoDimArray:(uint8_t [][3])twoDimArrayy;
@end

@implementation
-(void)twoDimArray:(uint8_t [][3])twoDimArray{
    //インスタンス変数にポインタを格納
    _twoDimArray = twoDimArray;
}
@end
引数の型は(uint8_t [][3])
それを受け取るインスタンス変数はuint8_t (*_twoDimArray)[3]とします。

これで、myClassは配列の先頭ポインタと、2次元目の要素数は3であるという情報を持つことができます。

ちなみに、今回渡しているのはインデックスカラーの画像のカラーマップです。

2012年11月19日月曜日

iOSのDopbox SDKを使ったアプリで、キャッシュよりも日付が新しかったらダウンロードする

DropboxのSDKでは、NSDocumentDirectoryにファイルを保存するようになっています。
restClient:loadedFile:メソッドを使うと、とにかくダウンロードしてしまうので、先にファイルの日付を比較し、Dropboxサーバー上のファイルが新しかったらダウンロードするようなコードを書きました。 Dropbox SDKの導入については、以下の記事を参考にしました。

Dropboxアプリ制作の流れ - teru_kusuの日記
[iPhone/iPad] Dropbox API を使ってみた | Sun Limited Mt.


DBRestClientDelegateを設定したクラスで、

インスタンス変数として、
    _dropbboxFilePath
    _localFilePath
を用意します。

_dropbboxFilePathはDropboxにあるファイルのパス、
_localFilePathはNSDocumentDirectoryを使って、
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    _localFilePath = [[documentDirectory stringByAppendingFormat:_dropbboxFilePath] retain];
と設定してあります。 そして、以下のようなメソッドを作ります。
-(void)loadIfFileModified{
     [[self restClient] loadMetadata:_dropbboxFilePath];
}

- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata{
    NSFileManager *fmanager = [NSFileManager defaultManager];
    NSError *error = nil;
    NSDictionary *attr = [fmanager attributesOfItemAtPath:_localFilePath error:&error];
    if([[metadata lastModifiedDate] compare:[attr fileModificationDate]]==NSOrderedDescending || error){
        //Dropbox上のファイルが更新されていたときの処理
        //エラーでもダウンロードを試みる
        //_dropboxFilePathのファイルを、_localFilePathに保存
        [[self restClient] loadFile:_dropbboxFilePath intoPath:_localFilePath];
    }else{
        //Dropbox上のファイルが更新されていなかったときの処理
    }
}
-(void)restClient:(DBRestClient *)client loadedFile:(NSString *)destPath{
    //ダウンロード完了後の処理
}


日付の比較については、以下の記事を参考にしました。
objective-Cでの日付の比較について

2012年11月17日土曜日

Macのキーボードショートカットの記号

iOSアプリを作りたくてMacを買ったクチなので、Macの基本操作に手間取っています。

ショートカットは使っているうちに覚えるかな~と思っていたのですが全く覚えず、いつまでたっても、マウスでメニュー操作。。

その原因は、メニューに並んでいるナゾの記号たち。
WindowsだったらCtrlとかshiftとか書いてあるので、「次からショートカットでやってみようか」となるのですが、記号が分からないのでそれがありません。

ということで、作業効率化のためにまずは記号の意味をまとめてみます。


「↑(上矢印)」:shift
「四つ葉のマーク」:言わずと知れたcommandキー
「^」:control(Aの隣のキー)
「 ̄\_」:alt,optionキー

しかし、こんな文字で表せないような記号、不便でしかたないじゃないか..