アットウィキロゴ

Bookmark共有

Objective-C


iOS8 と Swift


64bit 対応(2015/02対応義務化)

言語 内容
C
C++11
long は 32bit 以上が保証されているだけ。詳細は実装依存と言う扱い。
C99 / C++11でそれぞれ64bit以上を保証する long long(int) が定義された。
さらに64bit の整数を表す int64_t も定義された。
Java
C#
long は 64bit 整数を表す」と明確に規定。
C# については "long は System.Int64 の別名" と言う扱い。
Perl use bigint; と宣言する事で 64bit 整数にも対応。
Ruby
Python
必要に応じて整数型と多倍長整数型のどちらかに自動的に割り当てられる。
さほど気にする必要はない。
Javascript 整数については通常 53bit までしか正常に扱えないので bigint.js のような多倍長整数を扱うライブラリを作成して補っている。

Xcodeで32bit Architectureを設定する

  • 64bit ArchitectureがXcodeのデフォルトの設定(32bitは手動のみ)
1. プロジェクトを開き [PROJECT] メニューから [Build Settings] タブを開く。
2. [Architechtures] メニューにある Architectures の項目をクリックする。
3. [Other…] を選択 値をクリアした後、$(ARCHS_STANDARD_32_BIT) と入力する。

64bit 対応の具体例


64bit 環境では CGFloat は double型

  • CGFloat の書き方が正しい。
1. - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
  • Float の書き方ではヘッダーの高さすべて0となる。
1. - (float) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

NSInteger の値は 64bit 値。
NSInteger型をint型にキャストせずに代入すると警告 Implicit conversion loses integer precision: 'NSInteger'(aka 'long') to 'int' が出る。

  • キャストしていないので以下は誤り。
1. NSInteger nsi = 100;
2. int pi = nsi;
  • int(32bit) とキャストする必要がある。(NSIntegerはlong型 / int型をtypedefしたもの)
1. NSInteger nsi=10000000000;
2. long pl = 10000000000;
3. int pi = (int)nsi;
4. NSLog(@"%ld, %d, %ld", nsi, pi, pl);
5. //実行結果: sandbox[21604:507] 10000000000, 1410065408, 10000000000

Objective-C の long は 64bit ではない (オーバーフローも当然なる)

  • じつは int も long もともに 32bit 表現
1. NSLog(@"INT_MAX: %d", INT_MAX);
-INT_MAX: 2147483647
2. NSLog(@"LONG_MAX: %ld", LONG_MAX);
-LONG_MAX: 2147483647

  • じつは int も long もメモリサイズともに同じ
1. NSLog(@"sizeof(int): %ld", sizeof(int));
-sizeof(int): 4
2. NSLog(@"sizeof(long): %ld", sizeof(long));
-sizeof(long): 4

  • 64bit 表現は long long型を使う
1. NSLog(@"LONG_LONG_MAX: %lld", LONG_LONG_MAX);
-LONG_LONG_MAX: 9223372036854775807
2. NSLog(@"sizeof(long long): %ld", sizeof(long long));
-sizeof(long long): 8

iOS7.1 / Xcode5.1対応

  • デフォルトのビルド設定 $(ARCHS_STANDARD_32_BIT) が arm64 (64bit 対応を含む) ようになった。
    arm64 / armv7 / armv7s の 3つのアーキテクチャに対しビルドを行う。
    ソースコードからビルドを行っている場合大抵問題ないが、以下の様なケースでは要注意。
1. プロジェクト内に arm64 アーキテクチャに対応していない static ライブラリが含まれている時
2. 64bit になると危険なバグが発生するおそれがあるコードが含まれている時
-例えば CGFloat や NSInteger のサイズが変化したり、 &br() 各種ポインタのサイズが 4byte から 8byte に増えたりする場合。

  • Build Settings の Architectures (ARCH) を $(ARCHS_STANDARD_32_BIT) に設定した時
    内部的に armv7 / armv7s として扱いかつ CocoaPods が問題を起こさないとのこと。
    参考にご覧ください

メモリ管理

1. プロパティ属性を理解する
-@property (nonatomic, strong) NSString *message;
-strong は文字通り強い (外れない) weakだとすぐに解放されやすい
2. 基本、解放するタイミングは、viewDidDisappear や dealloc
-iOS6からは全く呼ばれなくなっています
-(iOS5でもメモリ不足時にしか呼ばれない)
3. メモリ不足時に EXC_BAD_ACCESS が発生して落ちる
-全ViewController で、didReceiveMemoryWarning が呼ばれる
-iOS5の場合、最前面以外のViewControllerで viewDidUnload が呼ばれる
-xib のつなぎ方にまずいものがある... などなど


jQuery


フレームワーク

UPnP


DLNA

    • サポートするコンテンツフォーマット
種類 必須 オプション
一般向け動画 MPEG-2 MPEG-1
MPEG-4
WMV9
一般向け静止画 JPEG GIF
PNG
TIFF
一般向け音声 LPCM AAC
MP3
AC3
WMA9
ATRAC3plus
モバイル向け動画 MPEG-4 AVC/H.264
MPEG-2
MPEG-4
VC-1
H.263
モバイル向け静止画 JPEG GIF
PNG
TIFF
モバイル向け音声 MP3
MPEG-4 AAC LC
MPEG-4 AE-AAC
MPEG-4 AAC


    • DMC (コントローラ) のところにモバイル端末 (iPhoneなど) が入る。
    • DMC -> DMS "BROWSE" (サーバー上の曲データより検索)
    • DMC -> DMP/DMR "PLAY" "SEEK" "STOP" (検索をかけた曲を直接操作)


AP

実機テスト方法

  • ざっくりですが、下記のサイトの要領で実行しています。
  • GClue blog

変数のゲッター、セッターを作成する場合

  • 変数のゲッター、セッターを作成する場合、@property の宣言のみすればよい
  • @interface直下での変数宣言(int item_id等)や、@synthesize宣言(@synthesize item_id;等)は必要ない。

自クラスの変数へのアクセス


Cellの作成(主にARCが無効の場合)

  • セルを作成する場合、処理(UIImageの設定やテキストの設定など)をバックグラウンドで行う必要がある。
  • ARCが有効の場合でも、UIImageの設定は処理に時間がかかるため、バックグラウンドに処理を投げる必要がある。

Mutable関連クラス

  • NSMutableDictionary,NSMutableArrayなどの可変可能クラスは、使用前に必ず領域の初期かを行う必要がある。
  • 例)NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
  • 初期化しない場合、落ちる可能性があります。(ARC無)

メッセージクラス定数の作り方(コード上で@"あいうえお"等の固定メッセージを別のクラスで定義して使用する方法)

  • 1. file >newからファイルをMessage.h Message.mを作成しMessage.mを削除
  • 2. Message.hをヘッダーコメント以外を削除して
  •  #define sAlertMeg @"あいうえお" と定義する。
  • 3. プロジェクトのfSupporting Files >AppDictionary-Prefix.pchに以下を追加
  •  #ifdef __OBJC__
  •    #import <UIKit/UIKit.h>
  •   #import <Foundation/Foundation.h>
  •   #import "Message.h"
  •  #endif
  • 4. @"あいうえお"を使用していたところをsAlertMegに変更すればOK
  • ※ Message.hとsAlertMegは任意の名称で使用する。
  •   ifdef __OBJC__に書くと全部のファイルにimportされる。

配列定数ファイルの作り方

  • 1. file >newからpropertyファイル(plistファイル)を作成
  • 2. 作成したpropertyファイルにArrayやDictionaryを設定
  • 3. 使用方法参考

その他


Androidの作り方




バグ・不具合を見つけたら? 要望がある場合は?

お手数ですが、メールでお問い合わせください。
最終更新:2014年11月14日 14:50
添付ファイル