#CoreFoundation入門 イントロ
##概要
デバッグ中にCF〜とかコンソールに表示されるが、そもそもCoreFoundationとはなんぞ?というレベルなのでこの機会に調べてみたいと思った。
以下をガイドとしてCoreFoundation の世界に飛び込みたい。
木下誠氏 [ダイナミックObjective-C 第33回〜第40回]
Core Foundation Design Concepts
##Core Foundationとは
C言語で実装した文字列や配列といった基本的なデータ構造を提供する「オブジェクト指向フレームワーク」
オブジェクト指向をサポートする文法がないC言語でも設計力でオブジェクト指向を実現している。
文法こそ違えど、Objective-Cで書かれたFoundationフレームワークとほとんど同じ機能をもつ(らしい?)
##ソースコードのダウンロード
Darwinの一部なのでここからダウンロードできる。(20141110現在では10.10の CF-1151.16はcomingSoon!の状態だった)
##準備 Xcode6 File → New → Project → OSX → Application → CommandLineTool を選択してプロジェクト作成
名前を適当に設定して開いたら、LinkBinaryWithLibrariesにCoreFoundationFrameworkを追加
main.mに下記を追加してとりあえず準備OK
#import <CoreFoundation/CoreFoundation.h>
##Hello,World
main.m内。コンソールに表示される。
CFShow(CFSTR("Hello, World!"));
ドキュメントより
Prints a description of a Core Foundation object to stderr.
void CFShow (
CFTypeRef obj
);
→ CFSTR("Hello, World!") で CoreFoundationObjectを作成
→ CFShowの引数のCFTypeRefが CoreFoundationObject
##Objective-Cとの互換性 CoreFoundationはObjective-Cで書かれたFoundationをCに移植したものなので当然互換性はあると思われるが、以下のようにキャストするだけで同じコードに異なる言語を混在させることができる。(bridgeを咬ませることなく !) これをToll-free bridgeと呼ぶ。
// NSStringのlengthメソッドをCFStringから呼び出す
CFStringRef cfString = CFSTR("CoreFoundation");
NSUInteger length = [(__bridge NSString*)cfString length];
NSLog(@"%ld",length);
// CFStringのCFStringGetRengthにNSStringを指定する
NSString *nsString = @"CoreFoundation";
int length2 = (int)CFStringGetLength((CFStringRef)nsString);
printf("%d \n",length2);
Toll-free bridgeはこっちで追っていいく