Skip to content

Instantly share code, notes, and snippets.

@satoshin2071
Last active November 13, 2018 07:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satoshin2071/aefc23c2aa968cc27fe3 to your computer and use it in GitHub Desktop.
Save satoshin2071/aefc23c2aa968cc27fe3 to your computer and use it in GitHub Desktop.
CoreFoundation Intro

#CoreFoundation入門 イントロ

##概要

デバッグ中にCF〜とかコンソールに表示されるが、そもそもCoreFoundationとはなんぞ?というレベルなのでこの機会に調べてみたいと思った。

以下をガイドとしてCoreFoundation の世界に飛び込みたい。

永野哲久氏[Hello, Core Foundation]

木下誠氏 [ダイナミック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はこっちで追っていいく

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment