iPhoneアプリを作っているときに、文字列をUTF-16に変換してから復元すると文字化けするという困った現象にぶちあたりました。 下記のコードを実行します。 NSString *str = @"はろーわーるど"; // UTF-16のchar配列を取得 const char *chars = [str cStringUsingEncoding:NSUTF16StringEncoding]; // 得られたchar配列からNSStringを作成 NSString *str2 = [NSString stringWithCString:chars encoding:NSUTF16StringEncoding]; // 出力 NSLog(@"%@", str2); 結果は次の通りです。 漰贰ﰰ輰ﰰ謰椰 見事、文字化けしました。 原因調査 (1) - エンディアンを指定する Objective-
はじめに NSDictionaryやNSArrayに日本語が含まれていると、”\U3044\U3044″みたいになってよめない。 文字化けしているというかエスケープされているというのか、なんというかもう読めない。 そこで! そこで、日本語で表示させる方法を発見しました! NSDictionary *dict = @{@"AA":@"ああ", @"いい":@{@"うう":@"ええ"} }; NSArray *arr = @[@"あああ", @"いいい"]; NSString *dictString = [NSString stringWithFormat:@"%@",dict]; NSString *dictUTFNonLossyASCIIStringEncoding = [NSString stringWithCString:[dictString cStringUsingEncoding
Providerとは Providerという考え方 対象とするオブジェクトを直接注入するのではなく、そのオブジェクトを取得する機能をもったオブジェクトを注入します。コードを見た方が理解しやすいので、下記にCoreData用のプロトコルを引用します。 #import <Foundation/Foundation.h> @protocol BTKCoreData <NSObject> @property(strong,readonly,nonatomic) NSManagedObjectModel *managedObjectModel; @property(strong,readonly,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property(strong,readonly,nonatomi
Objective-Cのメソッド名は冗長的で読みづらいと言われていますが、メソッド呼び出し式を関数でラップすることで、より簡潔な記述を実現することができます。 // Before [@"a" length]; [@"b" isEqualToString:@"b"] [@(4) isEqualToNumber:@(4)] // After len(@"a"); eq(@"b", @"b"); eq(@(4), @(4)); 目次 ヘルパー関数の作成方法 NSString向け関数 名前空間の活用 超万能自由関数 ヘルパー関数の作成方法 C++では関数の多重定義が可能となっています。そのため以下のような形で手軽に関数を作成することができます。 BOOL eq(NSString* a, NSString* b) { return [a isEqualToString:b]; } BOOL eq(N
Objective-CのオブジェクトをC++のクラスでラップすることで、==による比較処理やa.equals(b)形式によるメソッド呼び出し式を実現することができます。今回紹介するテクニックによって、Java言語やSwift言語のような簡潔な記述や高い開発効率を実現することが可能になります。 目次 NSObject 基本ラッパークラス NSString ラッパークラス NSNumber ラッパークラス 名前空間の定義 汎用化の技法 最適化と値渡し 仮想テーブルについて NSObject 基本ラッパークラス 実装方法は以下の通りです。ns_basic_objectは基本クラスです。実際にはns_basic_objectを継承したクラスをObjective-Cオブジェクト毎に作成して利用します。ns_objectがその継承例です。 template<typename T> struct ns_
以前は面倒で複雑な下準備が必要だったObjective-C++ですが、最近はとても手軽に扱えるようになりました。本記事ではObjective-C++の使い方や概念、注意点について解説します。 目次 Objective-C++とは Objective-C++の始め方・使い方 C++関連の処理や宣言は実装ファイル側に書く 関数/変数の公開方法 Objective-C++の注意点 関連知識 Objective-C++とは Objective-C++はObjective-CとC++を混在させたプログラミング言語です。Objective-C上でC++の構文や機能が利用できる他、C++で書かれた既存のライブラリやコードを活用することも可能となっています。 そもそもObjective-C自体は、C言語にSmalltalk風のオブジェクト指向機構を組み込んだサイボーグ言語として知られていますが、Objec
Objective-C特有の型だってもちろん使えます。 ターゲット2 コレクション型 Swiftでは基本となるコンテナクラスは今のところDictionaryとArrayのみという極めて貧弱極まりない環境です。 しかしその点Objective-C++なら、Objective-Cのコレクションクラスはもちろん、 状況に応じてC++のよく熟成された標準ライブラリに簡単に統合することが可能ですね。 例えば以下のように #import <Foundation/Foundation.h> #include <map> int main(int argc, const char * argv[]) { @autoreleasepool { struct CompareNSString { bool operator()(NSString * lhs, NSString *rhs)const { retu
NSScannerはNSStringを探索するクラスです。 正規表現やNSStringとは違った文字列の探索が出来ます。 ざっとした概要 NSScannerは位置(scanLocation)を保持しています。 各メソッドで位置を進めつつ順次探索することが出来ます。 例1 URLのクエリパラメーターを取得 NSScanner *scanner = [NSScanner scannerWithString:@"text=aiueo&query=search&target=ea"]; // 「query=」を見つけるまで探索する。scannerは「q」の位置に進む [scanner scanUpToString:@"query=" intoString:nil]; // 現在の位置(q)から「query=」を探索する。scannerは「s」の位置に進む [scanner scanString:@
3. Blocks Blocks are a proposed addition to C. Like a function pointer, except it also stores the context the block was created in. Similar to closures, lambdas, and anonymous functions in other languages. 4. Blocks Declaration Syntax: returnType (^blockName) (Arguments) Blocks may be anonymous. Definition Syntax: ^ returnType (Arguments) { code; } The return type and arguments are optional. GCD pr
(lldb) po [self _ivarDescription] <DetailViewController: 0x7fc94b637db0>: in DetailViewController: in UIViewController: _view (UIView*): <UIView: 0x7fc94b63c360> _tabBarItem (UITabBarItem*): nil _navigationItem (UINavigationItem*): <UINavigationItem: 0x7fc94b63ae20> _toolbarItems (NSArray*): nil _title (NSString*): nil _nibName (NSString*): @"jAO-Jw-mTY-view-IBP-J8-Ec0"<__NSCFString: 0x7fc94b6380e
「ないのなら作ってしまえpresentingViewController - Objective-Cで動的メソッド追加 - bricklifeのはてなブログ」というエントリーで、iOS 5から UIViewController に追加された presentingViewController というメソッド(プロパティ)の疑似メソッドを作成し、iOS 4でも使えるようにするという話をしました。 そこではメソッドが使われる前、例えばアプリケーション起動時などにObjective-Cランタイムの関数を使って追加する方法をとりましたが、今回は NSObject の resolveInstanceMethod: というクラスメソッドを使ってみます。 resolveInstanceMethod: resolveInstanceMethod: というメソッドは、オブジェクトに送られたメッセージが実装され
+ (void)initializeを利用 + (void)loadを利用 __attribute__((constructor))を利用 *こちらの説明は動的ロードなどによる挙動は考慮してないです 1.+ (void)initializeを利用 呼ばれるタイミング クラスが最初に利用される直前 注意点 サブクラスで+ (void)initializeを実装しないとスーパークラスの+ (void)initializeが呼ばれるので複数呼ばれる前提で実装する @interface Parent : NSObject @end @implementation Parent // このinitializeはParentクラスとChildクラスが最初に使われる時に // 呼ばれるので2回呼ばれることになる。 // なのでクラスを確認するかdispatch_onceなどを利用して初期化する + (v
Objective-C には @synchronized という、複数スレッドからの同時アクセスをブロックする排他制御を行う仕組みが用意されています。 この @synchronized ディレクティブでは、引数に指定した Objective-C インスタンスをキーにして、他からの同時アクセスをブロックしたり、他がブロックを解除されるのを待ったりできます。 これと同等の排他制御として ミューテックス があります。 他にも セマフォ、@property の atomic キーワード、NSLock、NSRecursiveLock などが利用できます。 クリティカルセクションを保護する 同時アクセスされたくない個所を、キーとして使う Objective-C インスタンスを引数にして @synchronized で括ります。 引数に渡すキーには self も使えるので、クラスインスタンス全体で 1
NSAttributedTextとDynamic Typeを利用したUITableViewを書いてみました。 NSAttributedText&Dynamic Type XCodeとか半年ぶりなので、正しいのかあまり自信はないです。 こんな感じに表示されます。tableViewのmarginやpaddingはかなり適当な値で、ちゃんと調べてません。 TableViewの作法 iOS6からいろいろ変わってます。「ついてこれる奴だけついてこいッ!」って勢いでいろいろ変えやがります。適合者への道は遠いです。 UITableViewCell の生成と再利用 iOS5までのdequeueReusableCellWithIdentifier:では、キャッシュのCellが存在すれば再利用し、なければ生成していましたが、iOS6以降はUITableViewの描画を行う時点で必要なCell数を計算し、事前に
Written by Mattt February 10th, 2014 This article has been translated into: 中文 #import <objc/runtime.h> Objective-C developers are conditioned to be wary of whatever follows this ominous incantation. And for good reason: messing with the Objective-C runtime changes the very fabric of reality for all of the code that runs on it. In the right hands, the functions of <objc/runtime.h> have the potenti
Advanced App Tricks.md 高度なアプリの技法 全体的に簡略化し、必要と思われる部分を抜粋しました。 アプリをiPhone 5に対応させる 適切に大きなスクリーンに対応するためには、デバイスの画面の大きさについて、何の仮定もしないことが大切です。画面やウインドウ、ビューの大きさを実行時に動的に取得し、インターフェイスを設定してください。また、ビューベースの制約を用いてユーザインターフェイスを 構築すれば、実行時にビュー階層の変化を容易に管理できます。 ユニバーサルアプリケーションを作成する ユニバーサルアプリとは、iPhone、iPod touch、およびiPadデバイス向けに最適化された単一のアプリです。現在のデバイスに適合したバイナリを1つだけ提供することによって、最適なユーザ体験を提供することができますが、開発者には追加の作業が発生します。デバイスの画面サイズが違う
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く