ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2016年3月24日木曜日

ついにObjective-Cでジェネリクス(テンプレート)が使えるようになったどー!

Xcode7.3から?Objective-Cでもジェネリクス(テンプレート)が使えるようになりました。

サンプル

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSMutableArray<NSString *> *names = [NSMutableArray array];
[names addObject:@"aa"];
NSLog(@"%@", names);

}



このエントリーをはてなブックマークに追加

2015年4月26日日曜日

Xcode6.3+swiftでInstallation Failed Invalid argumentが出たときにやったこと



あ、どうも、swift環境に悪戦苦闘している管理人です。
Xcode6.3+swiftの環境でInstallation Failed Invalid argumentが出てシミュレーターにインストールができないという現象に悩まされたのですが、原因は

Resources

という名前のフォルダーをプロジェクトに追加しているからでした。グループ名にResourcesを使っている場合は問題ありません。メニューのAdd Files toからResourcesという名前のフォルダを選択して追加するとInstallation Failed Invalid argumentが発生しました。
フォルダー名前を変更してXcodeを再起動すれば解決しました。


このエントリーをはてなブックマークに追加

2015年2月11日水曜日

UIImageViewの角を丸くする方法

今回はUIImageViewの角を丸くする方法を紹介します。
まずはソースコードによる設定方法

  1. UIImageViewのプロパティ「clipsToBounds」にYESを設定する
  2. UIImageViewのプロパティ「layer」のプロパティ「cornerRadius 」に角丸の半径を設定する



次にストーリーボードを使った設定方法

  1. UIImageViewを選択して「Identity inspector」のメニューを表示する
  2. 「User Defined Runtime Attributes」にて「clipsToBounds」と「layer.cornerRadius」を追加して設定する


このエントリーをはてなブックマークに追加

2014年9月27日土曜日

Xcodeでテストがfailedですぐに終了してしまう現象が発生した時に行ったこと


まず、下記のようなエラーログが出力されていないだろうか?
テストはiOS7.0以上でなければエラーで即終了してしまうのだ。



このエントリーをはてなブックマークに追加

2014年8月23日土曜日

iPhoneアプリでジャンケンゲームを作ってみた

ゲームプログラミングの"いろは"および"設計パターン"を模索する為にジャンケンゲームを作ってみました。

bitbucketにsrcをアップしてあります。

https://bitbucket.org/yskmanabe/janken

参考にしたサイト


考察

たかがジャンケンゲームなのにかなり複雑になっしまいました(特にモデルの部分)。
原因としてはじゃんけんの手をプレイヤーが任意のタイミングで決定することができるという仕様が考えられます。
もし、ジャンケン開始時に手を決定するフェーズを設けた場合、モデルの機能は

  • 勝敗の判定
  • 勝負履歴の管理

のみとなりかなりシンプルになると思われます。
さらに、勝敗がジャンケン開始前に確定しているのでビューやコントローラーもかなり作り易くなると思われます。
[追記]
”あいこ"のことを全然考えていませんでした。”ジャンケン開始時に手を決定するフェーズを設ける"という設計は"あいこ"に対応出来ませんね。


また、プレイヤーが任意のタイミングで手を決定するというアクション性の高いゲーム性を実現する為の設計を模索する必要が有りそうです。


このエントリーをはてなブックマークに追加

2014年5月16日金曜日

AVCaptureDeviceのフレームレートを設定したのに反映されないキミへ

まずは次の確認をしてほしい。

  1. フレームレートを設定する前にAVCaptureSessionへAVCaptureDeviceInputが追加されているか
  2. AVCaptureDeviceのlockForConfigurationを呼び出してデバイスをロックした後にフレームレートを設定しているか

上記を考慮したサンプルソースがこれだ

検討を祈る

このエントリーをはてなブックマークに追加

2014年2月23日日曜日

UIColorからrgbaを取得するときはCGColorGetComponentsを使いましょう

UIColorからrgbaを取得する際にUIColorクラスのインスタンスメソッド
- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha
を使用すると
rgbの値が同じ場合に限ってalpha値に0が設定されてしまいます。
例えば[UIColor whiteColor]のrgbaを取得した場合などです。
では正常な値を取得する為にはどうすればよいか、


const CGFloat *CGColorGetComponents(CGColorRef color)

を使用します。


このエントリーをはてなブックマークに追加

2013年11月11日月曜日

iOS7からhidesBottomBarWhenPushedでタブバーが非表示にならない?

iOS7になって

self.hidesBottomBarWhenPushed = YES;

を記述してもなぜかタブバーが非表示になってくれないので
UITabBarControllerのviewDidLoadにて

self.tabBar.hidden = YES;

を記述してとりあえず対応しました。
画面単位の表示、非表示の切り換えとかどうしよう。。。

このエントリーをはてなブックマークに追加

2013年8月29日木曜日

Facebook iOS SDKで扱われる日付文字列(created_time、updated_time等)をNSDateに変換する

Facebook iOS SDKを使用して検索等を実施した時の返却情報内の日付情報は文字列なのでそれをNSDateに変換する方法を紹介します。



ポイント
  1. Tの部分はシングルクォーテションで囲む
  2. フォーマットの最後の+0000の部分は「Z」と記述する


このエントリーをはてなブックマークに追加

2013年8月13日火曜日

[NSData dataWithContentsOfURL:]を使って簡単に非同期HTTP通信を実装する

iPhoneアプリでサーバーと非同期通信してデータを取得したいと思ったら
NSMutableURLRequest
NSURLConnection
NSOperationQueue
を使用して自前で実装したりフリーのライブラリを使用して受信データをNSDataに格納する人が多いと思いますが、実はNSDataには指定されたURLからデータを取得する
/*
 *指定されたurlからデータを取得する
 *@param url データを読み込むurl
 *@param readOptionsMask 読み込んだデータをキャッシュしない等のオプション指定
 *@param errorPtr エラーが発生した際のエラー格納先
 *@return 受信データ
 */
+ (id)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

というメソッドが用意されているんですね。
使い方はいたって簡単で


こんな感じでかなり簡単に実装できます。
が、このdataWithContentsOfURLには重大な欠点があります。
それは非同期では無いという事です。
つまりデータのダウンロードが完了するまでアプリがフリーズしてしまうんですね。

しかし、ご安心くださいGCD(Grand Central Dispatch)というObjective-Cの機能を使用すれば簡単に非同期にすることができるのです。
GCDの簡単な使い方は

dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q_main   = dispatch_get_main_queue();
dispatch_async(q_global, ^{
// ここに非同期(バックグラウンド)で実行したい処理を記述
});

こんな感じです。
GCDを使って先ほどのdataWithContentsOfURLを非同期化すると

こうなります。
ベーシック認証なんかもdataWithContentsOfURLを使用すれば簡単に実装できます。


このエントリーをはてなブックマークに追加

2013年5月3日金曜日

ARCを使わないObjective-Cのメモリ管理はこうすればリークも不正落ちも怖くない

Objective-Cはガベージコレクションを搭載していないので、メモリ管理が結構たいへんですがルールを決めてしまえばそんなに大変ではなくなるので楽してメモリ管理する方法をまとめてみました。

[前提条件]

  1. xcode4.5以上を使用する。

[ポイント概要]

  1. プロパティ記述時の属性(retain assign copy)を使い分ける
  2. alloc時にはautoreleaseを記述する
  3. 自クラス内のインスタンス変数へアクセスする時はプロパティを使用する
  4. retain、copy属性のプロパティはdealloc内でnilを代入する

[ポイント詳細]


ポイント1:プロパティの記述時の属性(retain assign copy)を使い分ける

ヘッダーファイルのクラス宣言内に記述するプロパティの属性を正しく使い分けます。

  1. object型はretainを指定する
  2. NSString型はcopyを指定する
  3. プリミティブ型はassignを指定する
  4. delegateはassignを指定する

※Objective-Cで使用できる主なプリミティブ型
short (signed short)
unsigned short
int (signed int)
unsigned int
float
double
char
BOOL

ポイント2:alloc時にはautoreleaseを記述する

オブジェクトをallocしたら必ずautoreleaseを記述します。


ポイント3:自クラス内のインスタンス変数へアクセスする時はプロパティを使用する

プロパティを使用しない場合、メモリリークや解放済みのオブジェクトへのアクセスが発生する可能性が高くなります。


ポイント4:retain、copy属性のプロパティはdeallocないでnilを代入する

retain、copy属性が指定されたプロパティはdeallocでnilを代入しないとメモリリークが発生してしまいます。


◎autoreleaseを記述しない方がいい場合

例外としてループ(for、while)内でオブジェクトを生成する場合はメモリ節約の観点からautoreleaseを使用しない方が良いでしょう。

このエントリーをはてなブックマークに追加

2013年1月30日水曜日

UIWebViewおよびUIImageでDocuments配下の画像を読み込む

UIWebViewやUIImageViewでDocumentsフォルダ配下の画像ファイルを指定するには
次のように実装します。

ちなみに

NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
では取得出来ませんでした。


このエントリーをはてなブックマークに追加

2013年1月25日金曜日

xcodeのストーリーボード(storyboard)で初期値設定を独自に追加する

ストーリーボードのattributes inspectorに表示されないプロパティやUIViewを継承して追加した独自のプロパティ等をストーリーボードから初期値設定したい場合は
identity inspectorUser Defined Runtime Attributes
に追加することで設定出来ます。
例)UIViewのexclusiveTouchを初期値YESに設定する


このエントリーをはてなブックマークに追加

2012年11月12日月曜日

unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

xcode4.5以降でUITableViewのdelegateメソッドが自動生成されると、このエラーが出る場合があります。
原因は

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{]
内に自動生成されたコードに
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

が記述されているからです。
このメソッドはiOS6.0以降でないと使用できません。
なのでiOS6.0未満も対応しているアプリではエラーとなってしまいます。

◎解決方法
従来の
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 
を使用するだけで解決します。

このエントリーをはてなブックマークに追加

2012年11月2日金曜日

UIWebViewにJSONデータを渡す with jQuery

jQueryを使用すればUIWebViewにJSON形式のデータを読み込ませることが簡単にできます。
手順はこちら

  1. NSString型のJSONデータを用意する。
  2. UIWebViewのjavascript実行メッソッドを呼ぶ。
  3. jQueryのパースメソッドを使用して文字列型のJSONデータをオブジェクトに変換する。

◎各ステップのサンプル

◎ポイント

  1. 「NSString stringWithFormat:@"loadJSON('%@');",」の%@シングルクォーテーションで囲む。
このエントリーをはてなブックマークに追加

2012年10月1日月曜日

'hoge.js' of type sourcecode.javascript for architecture i386ってwarnigを消したい

xcodeではAdd filesで.jsファイルを追加した場合にCompile Sourcesに追加されてしまい、「jsファイルのコンパイル方法がわかりません」と表題のワーニングが出てしまいます。
このワーニングを消す手順を紹介します。

  1. Compile Sourcesから.jsファイルを削除する
  2. Copy Bundle Resourcsに.jsファイルを追加する。
1.Compile Sourcesから.jsファイルを削除する



2.Copy Bundle Resourcsに.jsファイルを追加する。

このエントリーをはてなブックマークに追加

2012年9月5日水曜日

Objective-Cでクラスメソッドの有無を判定する

そのクラスに指定したクラスメソッド(セレクター)が存在するのか判定する為には
- (BOOL)respondsToSelector:(SEL)aSelector; 
を利用します。 このメソッドはインスタンスメソッドなんですけど、なぜかクラスに対して呼び出すことができます。コンパイルも通るし実行時に落ちたりもしません。(小一時間調べたけど分からずじまい)
このエントリーをはてなブックマークに追加

2012年8月24日金曜日

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」って警告がでちゃったYO

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」の解決方法は

  1. netinet/in.hをインポートする

このエントリーをはてなブックマークに追加

2012年5月9日水曜日

Objective-Cでクラス名文字列からインスタンスを生成する方法

Objective-Cでクラス名文字列からインスタンスを生成したい場合は
NSClassFromString(@"クラス名");
を使用します。

え、使うのかって?
たとえばこんなんどうでしょう?
このエントリーをはてなブックマークに追加

2012年5月8日火曜日

Instance method '-resizedImage:' not found (return type defaults to 'id')

「Instance method '-resizedImage:' not found (return type defaults to 'id')」って警告がでました。メソッドが見つからないと言っているようです。-resizedImage:が宣言されている.hファイルを#importすることで解決しました、めでたし、めでたし。
このエントリーをはてなブックマークに追加