SlideShare a Scribd company logo
1 of 55
Download to read offline
@taketo1024
話すこと
1. (中級) UIView を使いやすく
2. (上級) NSNull を黙らせる
1. UIView を使いやすく
初心者あるある

// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame.origin.x += 10;
}];
初心者あるある

// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame.origin.x += 10;
}];

え?
正しくは、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
CGRect frame = myView.frame;
frame.origin.x += 10;
myView.frame = frame;
}];
または、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame =
CGRectMake(myView.frame.origin.x + 10,
myView.frame.origin.y,
myView.frame.size.width,
myView.frame.size.height);
}];
あるいは、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame =
CGRectOffset(myView.frame, 10, 0);
}];
うーん…
そもそもなぜできない?

// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame.origin.x += 10;
}];
<UIKit/UIView.h>
@interface UIView(UIViewGeometry)
@property(nonatomic) CGRect frame;
@property(nonatomic) CGRect bounds;
@property(nonatomic) CGPoint center;
...
@property(nonatomic,readonly)
UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
@property(nonatomic,readonly)
UIWindow *window;
@end
<UIKit/UIView.h>
@interface UIView(UIViewGeometry)
@property(nonatomic) CGRect frame;
@property(nonatomic) CGRect bounds;
@property(nonatomic) CGPoint center;
...

CGRect, CGPoint は構造体
→ アクセスのたび値が生成されて返される

@property(nonatomic,readonly)
UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
@property(nonatomic,readonly)
UIWindow *window;
@end
<UIKit/UIView.h>
@interface UIView(UIViewGeometry)
@property(nonatomic) CGRect frame;
@property(nonatomic) CGRect bounds;
@property(nonatomic) CGPoint center;
...
@property(nonatomic,readonly)
UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
@property(nonatomic,readonly)
UIWindow *window;
@end

UIView, NSArray はオブジェクト
→ 特定のメモリ領域を指すポインタ
とにかく、
こういう風に書きたい

// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.x += 10;
}];
できます!
予備知識
1) プロパティはアクセサメソッドの略記法
2) カテゴリで勝手にクラスを拡張できる
1) プロパティはアクセサメソッドの
略記法

// このコードは…
CGRect frame = myView.frame;
// こう実行される
CGRect frame = [myView frame];
1) プロパティはアクセサメソッドの
略記法

// このコードは…
myView.frame = CGRectMake(0, 0, 100, 200);
// こう実行される
[myView setFrame:CGRectMake(0, 0, 100, 200)];
2) カテゴリで勝手にクラスを拡張できる

// UIView クラスを勝手に拡張
@interface UIView(TSExtension)
- (CGFloat)x;
- (void)setX:(CGFloat)x;
@end

UIView+TSExtension.h
2) カテゴリで勝手にクラスを拡張できる
// frame を使って getter / setter を定義
@implementation UIView(TSExtension)
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
@end

UIView+TSExtension.m
2) カテゴリで勝手にクラスを拡張できる

#import "UIView+TSExtention.h"
...
[UIView animateWithDuration:0.25 animations:^{
[myView setX:([myView x] + 10)];
}];

↑こう書ける
2つ合わせて、
こんなカテゴリを作れば、
@interface UIView(TSExtention)
@property (nonatomic) CGFloat x;
@end

@implementation UIView (TSExtention)
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
@end
こう書ける!

#import "UIView+TSExtention.h"
...
[UIView animateWithDuration:0.25 animations:^{
myView.x += 10;
}];
こう書ける!

#import "UIView+TSExtention.h"
...
[UIView animateWithDuration:0.25 animations:^{
myView.x += 10;
}];
// こう実行される
[myView setX:([myView x] + 10)];
こういう感じに作っとくと便利
@interface UIView(TSExtention)
@property
@property
@property
@property
@property
@property
@property
@property
@property
@property
@end

(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)
(nonatomic)

CGFloat x;
CGFloat y;
CGPoint origin;
CGFloat left;
CGFloat right;
CGFloat top;
CGFloat bottom;
CGSize size;
CGFloat width;
CGFloat height;
Oh, 直観的!
#import "UIView+TSExtention.h"
...
// myView1, myView2 が横に並んで 10pt 平行移動
[UIView animateWithDuration:0.25 animations:^{
myView1.left += 10;
myView2.left = myView1.right + 5;
}];
どうぞご利用下さい

https://github.com/taketo1024/
UIView-TSExtension
2. NSNull を黙らせる
ありきたりなサーバ通信
[NSURLConnection
sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response,
NSData *data, NSError *connectionError) {
NSDictionary *result =
[NSJSONSerialization JSONObjectWithData:data
options:0 error:nil];
_label.text = result[@"text"];
}];
ありきたりなサーバ通信
[NSURLConnection
sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response,
NSData *data, NSError *connectionError) {
NSDictionary *result =
[NSJSONSerialization JSONObjectWithData:data
options:0 error:nil];
_label.text = result[@"text"];
}];

レスポンスの text の値を _label に表示
oh...
oh...
原因
•レスポンスのJSON:
{
}

"text": null,
...

•[NSJSONSerialization
@{
};

JSONObject...] の結果:

@"text": [NSNull null],
...

こうなってた
レスポンスを片っ端から
NSNull チェックをする
のが正しいんだけども…
nil

はメッセージ投げても

ヌルポとか出さないのに、
NSNull は自己主張が強い。
黙らせる!
NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}
...(続く)
NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}

nil を返すだけの getter
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}
...(続く)
NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}

何もしない setter
...(続く)
NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));

}

} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
NSNull サイレンサーを実装
未定義のメッセージ受信時に必ず呼ばれる
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));

}

} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));

}

} else {
set*** なら silentSetter:
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;

を呼ばせ、
NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));

}

} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;

それ以外は silentGetter を呼ばせる。
試しにやってみる

// 露骨にヤバい奴
_label.text = (id)[NSNull null];
おぉ、クラッシュしない!

2014-02-25 13:39:02.348 called: [NSNull length]
2014-02-25 13:39:02.349 called: [NSNull length]
2014-02-25 13:39:02.349 called: [NSNull
_fastCharacterContents]

↑ UILabel の中でなんかやってるのが分かる
こんなのも行ける
NSString *str = (id)[NSNull null];
NSLog(@"string: %@",
[str stringByAppendingString:@"hoge"]);
NSArray *arr = (id)[NSNull null];
NSLog(@"array: %@", arr[1]);
NSDictionary *dic = (id)[NSNull null];
NSLog(@"dic: %@", dic[@"key"]);
余裕!
called: [NSNull stringByAppendingString:]
string: (null)
called: [NSNull objectAtIndexedSubscript:]
array: (null)
called: [NSNull objectForKeyedSubscript:]
dic: (null)
こんなことしていいんだろうか…
いいんです!!!
大事なのは保守性と安全性。
どこまでやるかはあなた次第。
ご利用は計画的に

https://github.com/taketo1024/
NSNull-TSSilencer
こちらもよろしく

http://www.slideshare.net/taketo1024/ss-30036615
Thank you!
@taketo1024

More Related Content

What's hot

第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成眞樹 冨澤
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」Tsuyoshi Yamamoto
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.jsyomotsu
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までMasayuki Nakano
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~JustSystems Corporation
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウスyoku0825
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料Mizuki Yamanaka
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングAtsushi Tadokoro
 
Three.jsで3D気分
Three.jsで3D気分 Three.jsで3D気分
Three.jsで3D気分 Toshio Ehara
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」technocat
 
Html canvas shooting_and_performanceup
Html canvas shooting_and_performanceupHtml canvas shooting_and_performanceup
Html canvas shooting_and_performanceupYohei Munesada
 
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみたJavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみたJustSystems Corporation
 
Creators'night#12今井
Creators'night#12今井Creators'night#12今井
Creators'night#12今井Daisuke Imai
 
Ember.js Tokyo event 2014/09/22 (Japanese)
Ember.js Tokyo event  2014/09/22 (Japanese)Ember.js Tokyo event  2014/09/22 (Japanese)
Ember.js Tokyo event 2014/09/22 (Japanese)Yuki Shimada
 

What's hot (20)

第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.js
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
Arctic.js
Arctic.jsArctic.js
Arctic.js
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵まで
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウス
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
 
Three.jsで3D気分
Three.jsで3D気分 Three.jsで3D気分
Three.jsで3D気分
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
Html canvas shooting_and_performanceup
Html canvas shooting_and_performanceupHtml canvas shooting_and_performanceup
Html canvas shooting_and_performanceup
 
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみたJavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
 
Creators'night#12今井
Creators'night#12今井Creators'night#12今井
Creators'night#12今井
 
機械学習
機械学習機械学習
機械学習
 
Ember.js Tokyo event 2014/09/22 (Japanese)
Ember.js Tokyo event  2014/09/22 (Japanese)Ember.js Tokyo event  2014/09/22 (Japanese)
Ember.js Tokyo event 2014/09/22 (Japanese)
 

Viewers also liked

あのパターンと仲良く付き合う 西磨翁 #yxcm
あのパターンと仲良く付き合う 西磨翁 #yxcmあのパターンと仲良く付き合う 西磨翁 #yxcm
あのパターンと仲良く付き合う 西磨翁 #yxcmMao Nishi
 
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学Taketo Sano
 
Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Hiramatsu Ryosuke
 
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」Ken Haneda
 
アプリエンジニアのデザインに対するこころがまえの話
アプリエンジニアのデザインに対するこころがまえの話アプリエンジニアのデザインに対するこころがまえの話
アプリエンジニアのデザインに対するこころがまえの話Shingo Sato
 
Appleの先を行くポストタッチインターフェース
Appleの先を行くポストタッチインターフェースAppleの先を行くポストタッチインターフェース
Appleの先を行くポストタッチインターフェースissaymk2
 
ソノアプリ リジェクト サレルッテヨ
ソノアプリ リジェクト サレルッテヨソノアプリ リジェクト サレルッテヨ
ソノアプリ リジェクト サレルッテヨKeisuke Tsukagoshi
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Taketo Sano
 
代数方程式とガロア理論
代数方程式とガロア理論代数方程式とガロア理論
代数方程式とガロア理論Junpei Tsuji
 
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記yohei sugigami
 
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg 「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg Junpei Tsuji
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先Taketo Sano
 
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列Taketo Sano
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
プログラマのための線形代数再入門
プログラマのための線形代数再入門プログラマのための線形代数再入門
プログラマのための線形代数再入門Taketo Sano
 
さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計Taketo Sano
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016Yota Ishida
 

Viewers also liked (20)

あのパターンと仲良く付き合う 西磨翁 #yxcm
あのパターンと仲良く付き合う 西磨翁 #yxcmあのパターンと仲良く付き合う 西磨翁 #yxcm
あのパターンと仲良く付き合う 西磨翁 #yxcm
 
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
「数える」とは何か? 〜 「とは何か?」を問う、AI時代の数学
 
Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm
 
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」
iBeacon yahoo 羽田資料 - ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」
 
アプリエンジニアのデザインに対するこころがまえの話
アプリエンジニアのデザインに対するこころがまえの話アプリエンジニアのデザインに対するこころがまえの話
アプリエンジニアのデザインに対するこころがまえの話
 
Appleの先を行くポストタッチインターフェース
Appleの先を行くポストタッチインターフェースAppleの先を行くポストタッチインターフェース
Appleの先を行くポストタッチインターフェース
 
ソノアプリ リジェクト サレルッテヨ
ソノアプリ リジェクト サレルッテヨソノアプリ リジェクト サレルッテヨ
ソノアプリ リジェクト サレルッテヨ
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作Konashi で始める iOS 電子工作
Konashi で始める iOS 電子工作
 
代数方程式とガロア理論
代数方程式とガロア理論代数方程式とガロア理論
代数方程式とガロア理論
 
実践Realm
実践Realm実践Realm
実践Realm
 
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記
 
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg 「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg
「五次方程式が代数的に解けないわけ」第3回プログラマのための数学勉強会 #maths4pg
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先
 
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
プログラマのための線形代数再入門2 〜 要件定義から学ぶ行列式と逆行列
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
プログラマのための線形代数再入門
プログラマのための線形代数再入門プログラマのための線形代数再入門
プログラマのための線形代数再入門
 
さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
 

Similar to Objective-C が好きになる Tips & Hack

20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようHiroaki Wakamatsu
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
UITableViewについて
UITableViewについてUITableViewについて
UITableViewについてteencoders
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイドYuichi Sakuraba
 
ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドLocalyticsJP
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話Shogo Sensui
 
Velocity.js is next generation animation engine.
Velocity.js is next generation animation engine.Velocity.js is next generation animation engine.
Velocity.js is next generation animation engine.陽平 南
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるAtsushi Tadokoro
 
Leap Motion - 1st Review
Leap Motion - 1st ReviewLeap Motion - 1st Review
Leap Motion - 1st ReviewTsukasa Sugiura
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0Yuichi Sakuraba
 
flasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみてflasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみて佐藤 俊太郎
 

Similar to Objective-C が好きになる Tips & Hack (20)

20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
 
Blocksの活用法
Blocksの活用法Blocksの活用法
Blocksの活用法
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
UITableViewについて
UITableViewについてUITableViewについて
UITableViewについて
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
 
ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイドハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイド
 
Vue.js で XSS
Vue.js で XSSVue.js で XSS
Vue.js で XSS
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話
 
Velocity.js is next generation animation engine.
Velocity.js is next generation animation engine.Velocity.js is next generation animation engine.
Velocity.js is next generation animation engine.
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Lt 111217
Lt 111217Lt 111217
Lt 111217
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
 
Leap Motion - 1st Review
Leap Motion - 1st ReviewLeap Motion - 1st Review
Leap Motion - 1st Review
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0
 
flasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみてflasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみて
 

More from Taketo Sano

Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Taketo Sano
 
トポロジーと圏論の夜明け
トポロジーと圏論の夜明けトポロジーと圏論の夜明け
トポロジーと圏論の夜明けTaketo Sano
 
Swift で数学研究のススメ
Swift で数学研究のススメSwift で数学研究のススメ
Swift で数学研究のススメTaketo Sano
 
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータTaketo Sano
 
特性類の気持ち
特性類の気持ち特性類の気持ち
特性類の気持ちTaketo Sano
 
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べSwift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べTaketo Sano
 
山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門Taketo Sano
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4Taketo Sano
 
情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16Taketo Sano
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトTaketo Sano
 
objc2swift (続・自動変換の野望)
objc2swift (続・自動変換の野望) objc2swift (続・自動変換の野望)
objc2swift (続・自動変換の野望) Taketo Sano
 
objc2swift (自動変換の野望)
objc2swift (自動変換の野望)objc2swift (自動変換の野望)
objc2swift (自動変換の野望)Taketo Sano
 
2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertibleTaketo Sano
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebViewTaketo Sano
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかるTaketo Sano
 
ひろ子 in Objective-C
ひろ子 in Objective-Cひろ子 in Objective-C
ひろ子 in Objective-CTaketo Sano
 
下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズムTaketo Sano
 

More from Taketo Sano (17)

Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
Divisibility of Lee’s class and its relation with Rasmussen’s invariant / 201...
 
トポロジーと圏論の夜明け
トポロジーと圏論の夜明けトポロジーと圏論の夜明け
トポロジーと圏論の夜明け
 
Swift で数学研究のススメ
Swift で数学研究のススメSwift で数学研究のススメ
Swift で数学研究のススメ
 
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ(意欲的な中高生のための)トポロジー・圏論・コンピュータ
(意欲的な中高生のための)トポロジー・圏論・コンピュータ
 
特性類の気持ち
特性類の気持ち特性類の気持ち
特性類の気持ち
 
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べSwift で数学のススメ 〜 プログラミングと数学は同時に学べ
Swift で数学のススメ 〜 プログラミングと数学は同時に学べ
 
山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門山手線は丸いのか?プログラマのためのトポロジー入門
山手線は丸いのか?プログラマのためのトポロジー入門
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4
 
情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16情報幾何学 #2 #infogeo16
情報幾何学 #2 #infogeo16
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
 
objc2swift (続・自動変換の野望)
objc2swift (続・自動変換の野望) objc2swift (続・自動変換の野望)
objc2swift (続・自動変換の野望)
 
objc2swift (自動変換の野望)
objc2swift (自動変換の野望)objc2swift (自動変換の野望)
objc2swift (自動変換の野望)
 
2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible2015 02-18 xxx-literalconvertible
2015 02-18 xxx-literalconvertible
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebView
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかる
 
ひろ子 in Objective-C
ひろ子 in Objective-Cひろ子 in Objective-C
ひろ子 in Objective-C
 
下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム下位互換コード隠蔽のストイシズム
下位互換コード隠蔽のストイシズム
 

Recently uploaded

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 

Recently uploaded (7)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 

Objective-C が好きになる Tips & Hack