Xcode [Tips] 「よく使う項目バー」
2010年12月15日水曜日 | Published in Tips, Xcode, Xcode 3.2.5 | 0 コメント
たまたま見つけた。
メインウィンドウの上部に1行分空きが表示されるようになる。ここへファイルをドラッグ&ドロップすると Safariのようにブックマークできる。
表示制御と表示内容はプロジェクト毎に設定できる。
うまく使えば便利かもしれない。
メインウィンドウの上部に1行分空きが表示されるようになる。ここへファイルをドラッグ&ドロップすると Safariのようにブックマークできる。
表示制御と表示内容はプロジェクト毎に設定できる。
うまく使えば便利かもしれない。
Xcode「Objective-C 2.0 に変換...」
2010年11月20日土曜日 | Published in Xcode, Xcode 3.2.5 | 0 コメント
Xcode には「Objective-C 2.0 に変換...」という機能がある。これは古いコードを Objective-C 2.0 から導入された Fast Enumerator と Property に変換(追加)してくれるというもの。
例えば次のクラスを定義しておいて Xcodeのメニュー「編集」から「Objective-C 2.0 に変換...」を選ぶ。
ダイアログが開くので「プロパティを使用」にチェックを付けて「プレビュー」を押す。
すると候補が表示される。必要なものだけチェックして「適用」を押すと。
こうなる。*.hファイルに @property が追加され
*.m ファイルにも @synthesize が追加される。
メンバ変数を後で追加した場合に適用した場合、その追加したメンバ変数のみ @property/@synthesize を追加してくれる。
変換対象がない場合はエラー。
適用前にファイルを選択するとどのような変更が加えられるかをプレビューできる。
iOS向け開発の場合、定番の "(nonatomic, retain)" を後から加える必要があったりするのだが、自動生成されるのは役に立つ。
もうひとつの「ループを改新」は NSEnumerator を使っている箇所を Fast Enumeration(for in〜)に変更してくれる。
最近は最初から Fast Enumeration を使うのでこちらの出番は無いだろう。
例えば次のクラスを定義しておいて Xcodeのメニュー「編集」から「Objective-C 2.0 に変換...」を選ぶ。
ダイアログが開くので「プロパティを使用」にチェックを付けて「プレビュー」を押す。
すると候補が表示される。必要なものだけチェックして「適用」を押すと。
こうなる。*.hファイルに @property が追加され
*.m ファイルにも @synthesize が追加される。
メンバ変数を後で追加した場合に適用した場合、その追加したメンバ変数のみ @property/@synthesize を追加してくれる。
変換対象がない場合はエラー。
適用前にファイルを選択するとどのような変更が加えられるかをプレビューできる。
iOS向け開発の場合、定番の "(nonatomic, retain)" を後から加える必要があったりするのだが、自動生成されるのは役に立つ。
もうひとつの「ループを改新」は NSEnumerator を使っている箇所を Fast Enumeration(for in〜)に変更してくれる。
最近は最初から Fast Enumeration を使うのでこちらの出番は無いだろう。
NSLog
2010年10月17日日曜日 | Published in iOS 4.0, iPhone, Xcode | 0 コメント
[前回] Cocoaの日々: __PRETTY_FUNCTION__
NSLog でどんな情報が表示できるか少し調べてみた。
コード
コード
NSLog:NSLog
NSLogの日本語リファレンス。書式が詳しく解説されていて役立つ。
NSLog tips and tricks - Stack Overflow
NSLogの様々な Tips。面白い。
NSLog でどんな情報が表示できるか少し調べてみた。
まとめ
シンボル 説明 例
__FILE__ ファイル名 /proj/classes/ViewController.m
__LINE__ ソースコードの行番号 364
__FUNCTION__ メソッド名(関数名) -[ViewController viewDidLoad:]
__PRETTY_FUNCTION__ クラス名とメソッド名 -[ViewController viewDidLoad:]
__FILE__の例
コード
NSLog(@"__FILE__: %s", __FILE__);結果
__FILE__: /Users/hashi/Development/ IOS-Sample-Code/XcodeMacro/Classes/ViewController.m
__LINE__の例
コード
NSLog(@"__LINE__: %d", __LINE__);結果
__LINE__: 44
__FUNCTION__の例
クラスメソッド内
コード+ (void)ClassFooMethodWith:(NSString*)arg1 and:(NSString*)arg2
{
NSLog(@"__FUNCTION__: %s", __FUNCTION__);
}結果__FUNCTION__: +[ViewController ClassFooMethodWith:and:]
インスタンスメソッド内
コード- (void)InstanceFooMethodWith:(NSString*)arg1 and:(NSString*)arg2
{
NSLog(@"__FUNCTION__: %s", __FUNCTION__);
}結果__FUNCTION__: -[ViewController InstanceFooMethodWith:and:]
関数内
コードvoid Function(NSString* arg1)
{
NSLog(@"__FUNCTION__: %s", __FUNCTION__);
}結果__FUNCTION__: Function
__PRETTY_FUNCTION__の例
クラスメソッド内
コード+ (void)ClassFooMethodWith:(NSString*)arg1 and:(NSString*)arg2
{
NSLog(@"__PRETTY_FUNCTION__: %s", __PRETTY_FUNCTION__);
}結果__PRETTY_FUNCTION__: +[ViewController ClassFooMethodWith:and:]
インスタンスメソッド内
コード- (void)InstanceFooMethodWith:(NSString*)arg1 and:(NSString*)arg2
{
NSLog(@"__PRETTY_FUNCTION__: %s", __PRETTY_FUNCTION__);
}結果__PRETTY_FUNCTION__: -[ViewController InstanceFooMethodWith:and:]
関数内
コードvoid Function(NSString* arg1)
{
NSLog(@"__PRETTY_FUNCTION__: %s", __PRETTY_FUNCTION__);
}結果__PRETTY_FUNCTION__: Function
参考情報
NSLog:NSLog
NSLogの日本語リファレンス。書式が詳しく解説されていて役立つ。
NSLog tips and tricks - Stack Overflow
NSLogの様々な Tips。面白い。
__PRETTY_FUNCTION__
2010年10月16日土曜日 | Published in iOS 4.0, iPhone, Xcode, サンプルあり | 0 コメント
@griffin_stewie さんのツィートで、__PRETTY_FUNCTION__ を NSLog() で使うと、処理中のクラスとメソッド名を表示できることを知った。
こうすると
さらに @hkato193 さんのツィートが気になっていたので確認してみた。
こんなコードを書いた。
実行結果。
ほー。
ソース
xcatsan's iOS-Sample-Code at 2010年10月16日 - GitHub
Cocoaの日々: Xcode のマクロ定義
こうすると
- (void)viewDidLoad {
:
NSLog(@"1: %s", __PRETTY_FUNCTION__);
:
}こう出力される。1: -[ViewController viewDidLoad]おーこれは便利だ。
さらに @hkato193 さんのツィートが気になっていたので確認してみた。
こんなコードを書いた。
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"1: %s", __PRETTY_FUNCTION__);
[UIView animateWithDuration:1.0
animations:^{
NSLog(@"2: %s", __PRETTY_FUNCTION__);
}];
[UIView animateWithDuration:1.0
animations:^{
NSLog(@"3: %s", __PRETTY_FUNCTION__);
}];
[UIView animateWithDuration:1.0
animations:^{
[UIView animateWithDuration:1.0
animations:^{
NSLog(@"4: %s", __PRETTY_FUNCTION__);
}];
}];
}
実行結果。
1: -[ViewController viewDidLoad] 2: __-[ViewController viewDidLoad]_block_invoke_1 3: __-[ViewController viewDidLoad]_block_invoke_2 4: __-[ViewController viewDidLoad]_block_invoke_4
ほー。
ソース
xcatsan's iOS-Sample-Code at 2010年10月16日 - GitHub
参考情報
Cocoaの日々: Xcode のマクロ定義
Xcode のマクロ定義
2010年10月7日木曜日 | Published in Xcode | 2 コメント
Xcodeのマクロ定義は下記が詳しい。
【Xcode】設定しておくと便利なカスタマイズいろいろ | iphoneアプリで稼げるのか
コピー元
これを下記へコピーする。
後はこれに追加していけばよい。
以下はプロパティ定義文を挿入するマクロ。
"ppo"と打って ESCキーを押すと下記のようになる。
同様に "ppr" "ppa" と打つと次のようになる。
なかなか便利。
【Xcode】設定しておくと便利なカスタマイズいろいろ | iphoneアプリで稼げるのか
コピー元
/Developer/Applications/Xcode.app/Contents/PlugIns/ TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro
これを下記へコピーする。
~/Library/Application Support/Developer/Shared/Xcode/Specifications/
後はこれに追加していけばよい。
以下はプロパティ定義文を挿入するマクロ。
{
Identifier = objc.property1;
BasedOn = objc;
IsMenuItem = NO;
Name = "@property retain";
TextString = "@property (nonatomic, retain) <#!statements!#>";
CompletionPrefix = ppr;
OnlyAtBOL = YES;
},
{
Identifier = objc.property2;
BasedOn = objc;
IsMenuItem = NO;
Name = "@property assign";
TextString = "@property (nonatomic, assign) <#!statements!#>";
CompletionPrefix = ppa;
OnlyAtBOL = YES;
},
{
Identifier = objc.property3;
BasedOn = objc;
IsMenuItem = NO;
Name = "@property outlet";
TextString = "@property (nonatomic, retain) IBOutlet <#!statements!#>";
CompletionPrefix = ppo;
OnlyAtBOL = YES;
},"ppo"と打って ESCキーを押すと下記のようになる。
同様に "ppr" "ppa" と打つと次のようになる。
なかなか便利。
Object with +0 retain counts returned to caller where a +1 (owning) retain count is expected
2010年8月28日土曜日 | Published in Xcode | 0 コメント
copyWithZone: を実装して Build And Analyze を掛けたところ下記の指摘を受けた。
原因は copyWithZone: で返すオブジェクトが autorelease となっていたため。copyWithZone: の戻りは作法として retainCount==1 として返す必要がある(呼び出し側がオーナーシップを持つ)。
NSCopying Protocol Reference
上記より抜粋:
それはそれでいいのだが、いじっているとこんな画面が出てきた。ほー。
こんな親切な説明が出てくるんだ。知らなかった。
(それだけ)
Object with +0 retain counts returned to caller where a +1 (owning) retain count is expected
原因は copyWithZone: で返すオブジェクトが autorelease となっていたため。copyWithZone: の戻りは作法として retainCount==1 として返す必要がある(呼び出し側がオーナーシップを持つ)。
NSCopying Protocol Reference
上記より抜粋:
The returned object is implicitly retained by the sender, who is responsible for releasing it.
それはそれでいいのだが、いじっているとこんな画面が出てきた。ほー。
こんな親切な説明が出てくるんだ。知らなかった。
(それだけ)
Xcode - 矩形選択
2010年7月18日日曜日 | Published in Tips, Xcode | 0 コメント
Xcode では option キーを押しながらマウスで矩形選択ができる。
optionキーを押すとマウスカーソルが+になるので、その状態で矩形の範囲を選択する。
貼り付けるとそこへコピーした時の矩形範囲そのままで挿入される。
optionキーを押すとマウスカーソルが+になるので、その状態で矩形の範囲を選択する。
貼り付けるとそこへコピーした時の矩形範囲そのままで挿入される。
Xcode - Build And Analyze 〜 問題の例
2010年7月13日火曜日 | Published in Xcode | 0 コメント
[前回] Cocoaの日々: Xcode - Build And Analyze
Build And Analyze で指摘されたケースについて記録を残しておく。
メモリリークのケース
Appleのサンプルからコピーしてきたものだが NSCalendar* gregorian の開放ができていなかった。return前に開放コードを追加する必要がある。
CGImageCreateWithMask()で生成した CGImageRef が開放されていない。次のように書き直す。
単純な開放忘れ。最後に開放コードを追加する。
これは cell が初期化されていないのと、switch-case文で default: が定義されていないことによる。今回は下記のコードを追加した。
これもauto変数が初期化されていないのと、switch-case文で default: が定義されていないことによる。今回は下記のコードを追加した。
height が初期化されていない。初期化処理を追加する。
これで無事完了。
Build And Analyze で指摘されたケースについて記録を残しておく。
Potential leak of an object allocated
メモリリークのケース
開放わすれ(NS系オブジェクト)
Appleのサンプルからコピーしてきたものだが NSCalendar* gregorian の開放ができていなかった。return前に開放コードを追加する必要がある。
[gregorian release];
開放忘れ(CG系関数)
CGImageCreateWithMask()で生成した CGImageRef が開放されていない。次のように書き直す。
CGImageRef maskImage = CGImageCreateWithMask(grayScaleImage, alphaImage); UIImage* grayScaleUIImage = [UIImage imageWithCGImage:maskImage]; CGImageRelease(maskImage);
開放忘れ(UIViewController)
単純な開放忘れ。最後に開放コードを追加する。
[viewController release];
undefined or garbage value
Undefined or garbage value returned to caller
これは cell が初期化されていないのと、switch-case文で default: が定義されていないことによる。今回は下記のコードを追加した。
UITableViewCell* cell = nil;
Pass-by-value argument in message expression is undefined
これもauto変数が初期化されていないのと、switch-case文で default: が定義されていないことによる。今回は下記のコードを追加した。
EditViewController* viewController = nil;;
The left operand of '<' is a garbage value
height が初期化されていない。初期化処理を追加する。
CGFloat height = 0;
これで無事完了。
Xcodeのテンプレート出力のコードが Google Objective-C Style Guide っぽくなっていた
2010年6月29日火曜日 | Published in Xcode, Xcode 3.2.3 | 0 コメント
それだけ。
Google Objective-Cスタイルガイド 日本語訳 | textdrop
Google Objective-C Style Guide
自分も Google Objective-C Style Guide は、一部採用(メンバ変数の後ろに _ を付ける所など)。
Xcode 3.2.3
@interface CoreDataRelations2AppDelegate : NSObject{ UIWindow *window; UINavigationController *navigationController; @private NSManagedObjectContext *managedObjectContext_; NSManagedObjectModel *managedObjectModel_; NSPersistentStoreCoordinator *persistentStoreCoordinator_; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (NSString *)applicationDocumentsDirectory; @end
Xcode 3.2.2
@interface TestAppDelegate : NSObject{ NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; UIWindow *window; UINavigationController *navigationController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; - (NSString *)applicationDocumentsDirectory; @end
Google Objective-C Style Guide
Google Objective-Cスタイルガイド 日本語訳 | textdrop
Google Objective-C Style Guide
自分も Google Objective-C Style Guide は、一部採用(メンバ変数の後ろに _ を付ける所など)。
登録:
コメント (Atom)
人気の投稿(過去 30日間)
-
公式リファレンスの Q&A に解説がある。 Technical Q&A QA1551: Detecting the start and end edit sessions of a cell in NSTableView. 方法は Delegate と Not...
-
2011年06月09日 追記 UITableViewCell の Identifier 設定を忘れてたので追記しました。 UINib を使うと簡単に Nib で定義した UITableViewCell が使える。 今回のサンプル: [関連] Cocoaの日々: [iO...
-
Asset Catalogには画像以外のデータも置ける。サウンドファイル(.aif)を置いてみた。 取り出すには NSDataAsset を使う。 let sound = NSDataAsset(name: name) // use sound.data 取り出したサウ...
-
パスワードを暗号化して安全に iPhone/iPad へ保管したい。iOS はこの用途の為に Keychain Services を提供している。今回は Keychain Services について調べてみた。リファレンスの内容に加え、独自に調査・検証した結果をまとめてある。動作...
-
Core Data を使ったアプリケーションで下のような検索機能を実装している。 設定された値を元に NSPredicate を作成し、Core Data に対して検索をかけるのだが、こういう場合に NSCompoundPredicate が役に立つ。 NSCompound...