Xcode,Objective-C

面食らうこと多数.いろいろメモ.

使用環境(2021年12月17日時点)

機材MacBook Pro 13inch, 2016
OSMacOS Monterey バージョン12.0.1

Xcode

ビルド⌘+b
デバッグ実行開始⌘+r
ドキュメントコメントを挿入してもらう⌘+Option+/
ステップオーバーF6
ステップインF7

Objective-C

[foo bar]という書き方「ブラケット記法」とか「メッセージ式」と呼ぶ.Objective-Cに特徴的な書き方.
普通のCなどで,
foo.bar;
のように書くものを,Objective-Cではこのように書く.
メソッドの引数は,「引数名:値」と書いたりする.
[rectangleImage setWidth:640 Height:480 Depth:3]みたいに書くとありがたみが分かるらしい.
たしかに
rectangleImage.set(640, 480, 3);
と書くよりは可読性は高そう.冗長にも見えるけど.
存在しないメソッドを書いても警告で済むとても困った.ブラケット記法で書かれていると,そのクラスに存在しないメソッドを書いていてもコンパイルエラーにならない.
NSObjectObjective-Cで扱うすべてのクラスのスーパークラス.
初期化は以下のようにする.

NSObject * foo;
foo = [[NSObject alloc] init];
または
[foo: [[NSObject alloc] init]];

※ どちらの書き方を選ぶべきかは勉強中...
文字列比較NSString* method; が “GET”と一致するか?

if ([@”GET” isEqualToString:method])
{
;
}
文字列定数と比較する時の技文字列定数を前においてisEqualToStringを使う(一つ上の書き方)
定義と実装classA.h, classA.c → classA.h, classA.m
クラスのプロパティ[ in classA.h ]
@interface ClassA {
int _foo; (← なくても良い.書かなければ自動的に生成される.)
NSString *_bar;(← なくても良い.書かなければ自動的に生成される.)
}
@property (assign) int foo; (← プロパティ.assignは属性の一つ.詳細は調べてください.)
@end

[ in classA.m ]
@implementation ClassA
@synthesize foo = _foo; (← _foo は省略可能.省略すると同名の変数が自動的に生成して使用される.)
@synthesize bar = _bar; (← _bar は省略可能.省略すると同名の変数が自動的に生成して使用される.)
@end

[ クラス内で参照する ]
self.foo;
self.bar;

[ プロパティとして参照する ]
classA.foo;
[classA foo]
クラスのプロパティ(簡素に書き直し)[ in classA.h ]
@interface ClassA {
}
@property (assign) int foo;
@property (assign) NSString *bar;
@end

[ in classA.m ]
@implementation ClassA
@synthesize foo;
@synthesize bar;
@end

日時を比較するときの注意事項

[システム環境設定][言語と地域]で「西暦(グレゴリオ暦」と「和暦」が選べ,ユーザーによっては「和暦」を選んでいる場合がある.それと気づかずにアプリを開発していると,”文字列評価”で有効期限を判断するなどの場合に正しい評価が出来なくなるので注意.開発時にロケールや暦法を意図するものに設定してから評価すると良い.

Rfc2898DeriveBytes のMac版の実装でエラー

暗号化されたUTF8のデータを復号したいが,うまくいかない.

Microsoftの”Rfc2898DeriveBytes クラスで”HMACSHA1 に基づく擬似乱数ジェネレーターを使用してパスワード ベースのキー派生機能 (PBKDF2) を実装します”のMac版移植を利用する.

https://github.com/matthewreagan/RFC2898DeriveBytes

エラー発生箇所

・・・
            unsigned char U[CC_SHA1_DIGEST_LENGTH];
・・・
            memcpy(U, [mSalt bytes], [mSalt length]);       ← ココ

CC_SHA1_BLOCK_BYTES が `CommonDigest.h`で以下のように宣言されている.

#define CC_SHA1_DIGEST_LENGTH   20          /* digest length in bytes */

MicrosoftのコンストラクタRfc2898DeriveBytes(String, Byte[])の説明には,salt(2つ目の引数)は「8バイト以上」と書かれています.しかし,上記実装では「20バイト未満」しか格納できません.どうやら20バイト以上の長さのsaltを突っ込んでしまっている模様.