Describes the macOS Objective-C runtime library support functions and data structures.
![Objective-C Runtime | Apple Developer Documentation](https://cdn-ak-scissors.b.st-hatena.com/image/square/adf5912792dfda19653b4378f6036c402e3ed51c/height=288;version=1;width=512/https%3A%2F%2Fdocs.developer.apple.com%2Ftutorials%2Fdeveloper-og.jpg)
Describes the macOS Objective-C runtime library support functions and data structures.
どうも、佐野です。今回は UIAlertView の拡張カテゴリを作って、delegate ではなく Block でコールバック処理を記述するための拡張カテゴリの作り方を紹介します。 iOS4 から Objective-C では Blocks という独自のクロージャ機能が搭載されました。これによってアニメーションの記述やコールバック処理などグッと直観的・効率的に記述できるようになったのですが、残念ながら UIKit によって提供されているクラスの多くはまだ Blocks に最適化された作りになっていません。UIAlertView もそのひとつです。 UIAlertView は、その delegate を実装することでユーザアクションに対する処理を記述する訳ですが、どうも使い勝手が悪い。例えば、同じで画面内で2通りの UIAlertView を表示するような UIViewController
Objective-Cのオープンソースライブラリのコードを眺めていると __attribute__ という文に出くわすことがしばしばあります。 これは属性を表すキーワードで、普段そこまで使う機会がないのですが、調べるうちに何かと多人数の開発の時にはご利益がありそうな機能ばかりだと感じたので、まとめておきます。尚、使用環境はXcode5, ARCです。 何ができる? __attribute__はコンパイラディレクティブの一種で、変数、型、関数(Objective-Cではクラスやメソッドも)の属性を決めることができます。コンパイラによる静的チェックや関数の最適化の役に立ちます。 __attribute__の後にはカッコが二重に続き、二重括弧の中でコンマ区切りの属性リストを付与することができます。 __attribute__は変数、型、関数宣言の前後に置かれます。Objective-Cではメソッ
#import "FlipSegue.h" @implementation FlipSegue - (void)perform { UIViewController *sourceViewController = (UIViewController *)self.sourceViewController; UIViewController *destinationViewController = (UIViewController *)self.destinationViewController; [UIView transitionWithView:sourceViewController.navigationController.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft animations:
lldbのrecursiveDescriptionがめっちゃ便利です。 lldbでUIViewのsubviewを再帰的に確認できます。 (lldb) po [self.view recursiveDescription] <UIView: 0x113713260; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CALayer: 0x10bca42f0>> | <_UILayoutGuide: 0x10bcac7d0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x11370df90>> | <_UILayoutGuide: 0x10bcb0650; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x10bc257
ちょっと3Dグラフィックスやってみようかと思って、もしかしたら座標変換のライブラリはないかとドキュメントを見ていたら、Core Animationの関数を使ってアフィン変換・透視変換とかできる上に、そのまま描画もできるらしいということが分かった。 Core Animationプログラミングガイド: レイヤジオメトリと変換 Core Animationプログラミングガイド: Core Animationレイヤの配置 やってみた結論としては、がっつり3DやるならやっぱりOpenGLとか使った方が良いと思う。けど、簡単な図形や画像をちょっと俯瞰っぽく見せたい、ぐらいなら使えるかも。 ちなみにOSバージョンはSnow Leopard(10.6.6)です。 追記: これで立体迷路アプリ作ってみた 準備1. CocoaのクラスにCALayerを貼付ける とりあえず適当なサイズのウィンドウを表示させてC
strong __strong修飾子に対応するプロパティ属性です。strong属性を用いたプロパティは参照先オブジェクトのオーナーとなります。 weak __weak修飾子に対応するプロパティ属性です。__weak修飾子を持った変数と同様、weak属性のプロパティも、参照先のオブジェクトが破棄されたら自動的にnilが代入されます。weak属性を用いたプロパティはオーナーシップ権を持ちません。 weak属性は、delegateやOutletの変数に最適です。 なお、iOS 4では__weak修飾子が使えないため、プロパティのweak属性も使えません。この場合は、後述のunsafe_unretainedを使いましょう。 copy __strong修飾子に対応しますが、実際にはコピーオブジェクトが代入されます。copy属性を用いたプロパティは参照先オブジェクトのオーナーとなります。 unsafe
iOS4からBlockが導入されました。利用目的としてはDelegateパターンと大差ないと思っていますが、処理記述が呼び出し元で記述できることで可読性が高くなります。 また、コールバック時に利用されるperformedSelectorが非常に使いづらく複数の引数となった場合などを考慮してNSDictionaryで定義したりInvocationを使う必要がったりと面倒な点が多々ありました。 今回は、CoreFoundationにカテゴリで組み込まれたBlockを活用したBlocksKitフレームワークを紹介したいと思います。かなり便利なため、今後のコーディングスタイルを変えてしまうほどのインパクトがあると個人的には思っています。 BlocksKit https://github.com/zwaldowski/BlocksKit BlocksKitはBSD, MITライセンスの元で利用可能で
2017/05/12追記 この記事はだいぶ古い記事なのですがありがたいことにアクセスが多いです。ですがもし今swift3で書くのであれば以下のページを参考にした方がよいと思います。 非常に簡単に書けるようになっています。 >> Grand Central Dispatch Tutorial for Swift 3: Part 1/2 >> Grand Central Dispatch Tutorial for Swift 3: Part 2/2 >> [Swift 3] Swift 3時代のGCDの基本的な使い方 以下元の記事となります。 ==== こんにちは。きんくまです。 今回はスレッドのはなしです。 ふつう時間のかかる処理をそのままやってしまうと、アプリケーションの応答が止まってしまって、 「何これ、壊れてんの?」なんて状態になります。 UIなどの画面の更新はメインスレッドで行われて
Objective-C Automatic Reference Counting (ARC)¶ About this document¶ Purpose¶ The first and primary purpose of this document is to serve as a complete technical specification of Automatic Reference Counting. Given a core Objective-C compiler and runtime, it should be possible to write a compiler and runtime which implements these new semantics. The secondary purpose is to act as a rationale for wh
iOS6からFacebook、微博(Weibo)、Twitterを統合したSocial.frameworkが追加されました。例によってAOuth認証などの面倒な手続きは全てiOS側で行なってくれるので投稿だけであれば、数行のコードで実装が可能です。 iOS5から追加されたTwitter.frameworkは廃止の方向になるので、新しく実装する場合はSocial.frameworkで実装した方がよさそうです。実装方法はTwitter.frameworkと同じような作りとなっているので簡単に移行できると思います。 SLComposeViewControllerでの投稿方法 プロジェクトのBuild PhasesのLink Binary with Librariesで「Social.framework」を追加します。 ヘッダにSocial.hをインポートします。 #import <Social/
アクセサを使って値をインクリメントしています。これ、ぱっと見て問題があると感じますか? このコードはマルチスレッド環境で動くため、プロパティは以下のようにデフォルトのatomicで(nonatomicを指定せず)定義されています。 @interface AtomicTest : NSObject { int count; } @property(assign) int count; - (void)increment; @end @implementation AtomicTest @synthesize count; - (void)increment { self.count++; } @end int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; A
常々「クラス拡張をカテゴリってゆーな」って思ってるんだけど、「無名カテゴリ」自体は公式の呼称なんだよね。 [Objective-C] クラス拡張と無名カテゴリ - Qiita Objective-Cのクラス・カテゴリ・クラス拡張の整理 - $ cat /var/log/shin クラス拡張は、無名のカテゴリに似ています。が、別物です。一番の違いは、インスタンス変数を宣言できることと、宣言したメソッドはクラス本体の(=カテゴリ無しの)@implementationで実装しなければならない点です。 クラス拡張とカテゴリの一番の違いは、「クラス拡張はクラス実装と共にランタイムにロードされることが保証される」ことだと思います。 文脈として、もともとobj-c 2.0以前にはクラス拡張がなく、またメソッドのプロトタイプ宣言が必須だったこともあり、「外部に公開したくないメソッド宣言はプライベートなカテ
カテゴリーとクラスエクステンションは、Objective-Cで使えるクラス拡張の方法です。 既存のクラスにメソッドを追加したりクラスの分割をしたりすることができるので、中級以上のObjective-Cユーザーには必須の機能です。 カテゴリーによるメソッド追加 カテゴリーを使うと、既存のクラスにメソッドを追加することができます。 自分でつくったクラスにメソッド追加することもできますし、システムのフレームワークの中のクラスに追加することもできます。 例えば、NSStringクラスに二つの新しいメソッドを付け加えた例を見てみましょう。 まず、追加メソッドのヘッダーファイルはこうなります。 // NSString+ToyshipMode.h @interface NSString (ToyshipMode) + (void)ToyshipMode1; - (void)ToyshipMode2; @
以前こんな記事を書きました。 Objective-Cのプロトコルとデリゲートのまとめ - $ cat /var/log/shin 現時点で、こんな場末のブログで唯一ブクマが多い記事なのですが、その文末で、 次は、カテゴリについて勉強したいと思います。 Objective-Cのプロトコルとデリゲートのまとめ - $ cat /var/log/shin なーんて書いてから、はや9ヶ月超。ようやくカテゴリについて調べる機会が来たので、まとめてみます。 座学編 クラスの基本 まず初めにクラスの基本を整理しておきます。 // ex1.h #import <Foundation/Foundation.h> @interface MyClass1 : NSObject - (void)publicMethod; @end // ex1.m #import "ex1.h" @implementation
iPhone Dev Center から CoreDataBooks というサンプルコードを入手してソースを読む。なるほど NSFetchedResultsController を使うと UITableView で CoreData を使うのが楽になりそうだ。 CoreDataBooks の動作はこんな感じ。 リストに詳細表示、それと項目の編集を行う3つのビューから構成される。データの格納に CoreData を採用していて UITableView との連携に NSFetchedResultsController を使っている。 NSFetchedResultsController の使い方を理解するためにこのコードを参考にしつつ、(テーブルが一つで)構造が単純な OneLiner を NSFetcedResultsController を使うバージョンに書き換えてみる。 MainView
ベトナムで開発を始めてはや4ヶ月目、田中です。 iOS7から追加されたUIViewControllerAnimatedTransitioningとUIViewControllerTransitioningDelegateの2つのプロトコルを使用して画面遷移のアニメーションをカスタムする方法を紹介します。 このようにいつものスライドして遷移するのではなく、好きなアニメーションで画面を遷移させることができます。 ViewController.m #import "ViewController.h" #import "AnimationController.h" @interface ViewController () <UIViewControllerTransitioningDelegate, UINavigationControllerDelegate> { AnimationContro
これまでの記事はこちら: [iOS5] ARC (Automatic Reference Counting) : Overview [iOS5] ARC : プロパティ属性と使い方 [iOS5] ARC : Outletにはweakプロパティを使おう [iOS5] ARC : 循環参照 ARCまとめの最終回はAutoreleaseとキャストについてです。また、最後で簡単にですが、Xcodeの環境設定についても触れます。 Autorelease ARC環境下では、これまでのNSAutoreleasePoolは使えません。そうは言っても、別にAutorelease環境がなくなってしまったわけではなく、作法が少し変わったのですね。 まずは、参考までにmain.mを見てみましょう。 非ARC(マニュアルメモリ管理) int main(int argc, char *argv[]) { NSAuto
どうも、吉村です。 今回はiOSにおけるCoreGraphicsの話題でなおかつCGContextDrawImage(), およびCGImageRefにフォーカスした非常にピンポイントな話題です。 CGContextDrawImageが遅い! そう感じたのは以下のような状況です。 「CGContextDrawImage()を1秒間に何十回もコールする」 主にリアルタイムグラフィックスを扱う場合ですね。 え?そんなに? と意外かもしれませんが、CGContextDrawImage()は、 ゲーム等を作る場合以外では意外と高いレートでコールされることはないので、気づいている人は少ないかもしれません。 では何が遅いのか? それは 「画像をラスターデータに展開する処理」 です。 一般的な画像形式は基本的に圧縮されています。 例えばpngは、Deflateというアルゴリズムを使うzlibにより圧縮さ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く