アプリ開発をしていてメモリリークが頻発していてアプリが落ちる要因となっており開発が終わってからObjective-Cについて改めて見なおしてみた。
Objective-Cは参照カウンタによるメモリ管理をしていてretainで+1、releaseで-1され参照が無くなった後、deallocが呼ばれるという認識はあった。
しかしinitしても参照カウンタが+1ではなく違う値になったりとしていたのでNSStringで様々な生成方法をやりまとめてみた。


// TestObject.h
@interface TestObject : NSObject {
    NSString *m_strText;
}
@property (nonatomic, readwrite, retain) NSString *strText;
@end

// TestObject.m
@implementation TestObject
@synthesize strText = m_strText;

- (id)init {
    self = [super init];
    if (self) {
        /*
         * m_strTextの生成処理.
         */
        NSLog(@"init [m_strText retainCount] = %d", [m_strText retainCount]);
    }
}
- (void)dealloc {
    NSLog(@"dealloc1 [m_strText retainCount] = %d", [m_strText retainCount]);
    [m_strText release];
     NSLog(@"dealloc2 [m_strText retainCount] = %d", [m_strText retainCount]);
    [super dealloc];
}
@end

// 【パターン1:[[alloc] initWithString]】
m_strText = [[NSString alloc] initWithString:@"sample"];
NSLog(init)     -> 2147483647
NSLog(dealloc1) -> 2147483647
NSLog(dealloc2) -> 2147483647

// 【パターン2:[[alloc] initWithFormat]】
m_strText = [[NSString alloc] initWithFormat:@"%@", @"sample"];
NSLog(init)     -> 1
NSLog(dealloc1) -> 1
NSLog(dealloc2) -> エラー

// 【パターン3:[[alloc] initWithUTF8String]】
m_strText = [[NSString alloc] initWithUTF8String:"sample"];
NSLog(init)     -> 1
NSLog(dealloc1) -> 1
NSLog(dealloc2) -> エラー

// 【パターン4:プロパティに対して[[alloc] initWithFormat]】
self.strText = [[NSString alloc] initWithFormat:@"%@", @"sample"];
NSLog(init)     -> 2
NSLog(dealloc1) -> 2
NSLog(dealloc2) -> 1

// 【パターン5:[stringWithFormat]】
m_strText = [NSString stringWithFormat:@"%@", @"sample"];
NSLog(init)     -> 1
NSLog(dealloc1) -> エラー
NSLog(dealloc2) -> エラー

// 【パターン6: [stringWithString]】
m_strText = [NSString stringWithString:@"sample"];
NSLog(init)     -> 2147483647
NSLog(dealloc1) -> 2147483647
NSLog(dealloc2) -> 2147483647

// 【パターン7:代入】
m_strText = @"sample";
NSLog(init)     -> 2147483647
NSLog(dealloc1) -> 2147483647
NSLog(dealloc2) -> 2147483647

エラーとなっている箇所は共通して、すでにリリースされているオブジェクトに対してreleaseを行ったというものだったので、
エラーが出ている箇所は正常に解放されていると思う。
[[NSString alloc] initWithXXXXX];で生成したものはdeallocでreleaseする必要があることは分かった。
しかし、stringWithXXXXなどのようにallocせずに生成したものに対しては参照カウンタは2147483647(intの最大値)になってreleaseしてもカウンタが減らず定数扱いになってる。
これはちゃんと解放されるのだろうか。

初心に帰ってObjective-Cをじっくり勉強し直さないとだめですね。

1. 2012/01/07(土) セイクリッドセブン舞台挨拶 池袋シネマサンシャイン
2. 2012/01/08(日) マクロスF d娘フェスb 第2部 パシフィコ横浜
3. 2012/01/28(土) マクロスF F魂+会員限定ファンクラブイベント 夜の部 浅草公会堂
4. 2012/01/29(日) May'n ふぁんくラ部イベント
5. 2012/02/02(木) ミレーヌナイト2 東京
6. 2012/02/04(土) THE ポッシボー VS アフィリア・サーガ・イースト 新宿BLAZE
7. 2012/02/04(土) アフィリア・サーガ・イースト VS THE ポッシボー 新宿BLAZE
8. 2012/02/05(日) 中島愛 TRY UNITE!発売記念握手会 大宮
9. 2012/02/12(日) 飛蘭 LIVE TOUR 03 -ALIVE- 梅田AKASO
10. 2012/02/18(土) 飛蘭 LIVE TOUR 03 -ALIVE- 恵比寿リキッドルーム
11. 2012/02/26(日) 坂本真綾 FCイベント ZEPP TOKYO
12. 2012/03/10(土) ももいろクローバーZ 「猛烈宇宙交響曲・第七楽章『無限の愛』」発売記念握手会 ベルサール秋葉原
13. 2012/03/11(日) ももいろクローバーZ モーレツ☆大航海ツアー2012 横浜BLITZ
14. 2012/03/20(火・祝) May'n special concert 2012 『 May'n☆GO!AROUND!! 』 横浜アリーナ
15. 2012/03/25(日) 中島愛 3rd Live Tour 2012 〜とことんBe With You!〜 ZEPP NAGOYA
16. 2012/03/31(土) アニメコンテンツエキスポ2012 幕張メッセ
17. 2012/04/07(土) 中島愛 3rd Live Tour 2012 〜とことんBe With You!〜 ZEPP OSAKA
18. 2012/04/08(日) 中島愛 3rd Live Tour 2012 〜とことんBe With You!〜 ZEPP TOKYO
19. 2012/04/15(日) ミューコミ+ presents ミュ〜フェス2012〜Spring〜 ライブ1000本観戦アナ吉田のサブカル全部乗せ! 渋谷公会堂
20. 2012/04/21(土) ももいろクローバーZ ももクロ春の一大事2012 横浜アリーナまさかの2DAYS -ももクロ☆オールスターズ 2012- 横浜アリーナ
21. 2012/04/22(日) ももいろクローバーZ ももクロ春の一大事2012 横浜アリーナまさかの2DAYS -見渡せば大パノラマ地獄- 横浜アリーナ
22. 2012/04/30(月・祝) Mylene Night #02 大阪シャングリラ
23. 2012/05/13(日) 中島愛 写真集「まめぐるり」発売記念サイン&握手会 東京 とらのあな
24. 2012/05/13(日) 中島愛 写真集「まめぐるり」発売記念サイン&握手会 東京 秋葉原ゲーマーズ
25. 2012/05/25(金) May'n WORLD TOUR 2012「ROCK YOUR BEATS」神奈川 CLUB CITTA
26. 2012/05/26(土) Super Game Song Live 2012 神奈川 パシフィコ横浜
27. 2012/06/03(日) 輪廻のラグランジェ 「鴨女文化祭 〜逃げるな!攻めろ!ジャージ部魂!!〜」昼の部 東京 品川ステラボール
28. 2012/06/03(日) 輪廻のラグランジェ 「鴨女文化祭 〜逃げるな!攻めろ!ジャージ部魂!!〜」夜の部 東京 品川ステラボール
29. 2012/06/05(火) 中島愛ファンクラブイベント「こまめ喫茶」 東京 品川ステラボール
30. 2012/06/09(土) ももいろクローバーZ ももクノvol.3 1部 埼玉 東武動物公園ハッピーオンステージ
31. 2012/06/09(土) プラチナ・ジャズ・オーケストラ presented by ラスマス・フェイバー 東京 Billboard Live TOKYO
32. 2012/06/17(日) ももいろクローバーZ ももクロ夏のバカ騒ぎ Summer Dive2012 Tour 開幕戦 -6.17 NHKホール大会- 3D生中継 東京 板橋ワーナー・マイカル・シネマズ
33. 2012/07/07(土) 小松未可子 フリーイベント「七夕祭り〜星に願いを乗せて〜」 東京 東武百貨店池袋店8F屋上「スカイデッキ広場」
34. 2012/07/14(土) ももいろクローバーZ ももクロ夏のバカ騒ぎSummer Dive 2012 Tour 兵庫 神戸ワールド記念ホール
35. 2012/07/15(日) 小松未可子 「cosmic EXPO」発売記念イベント 大阪 タワーレコード梅田NU茶屋町
36. 2012/07/15(日) 水樹奈々 NANA MIZUKI LIVE UNION 2012 大阪城ホール
37. 2012/07/16(月・祝) ももいろクローバーZ ももクロ夏のバカ騒ぎSummer Dive 2012 Tour 愛知 名古屋国際会議場センチュリーホール
38. 2012/07/20(金) May'n WORLD TOUR 2012「ROCK YOUR BEATS」神奈川 横浜BLITZ
39. 2012/07/22(日) ももいろクローバーZ ももクロ夏のバカ騒ぎSummer Dive 2012 Tour 静岡 アクトシティ浜松 大ホール

Twitterの投稿時間の書式変更をしたけど、Webやクライアントであるような(XX秒前)とか入れれば時間差がわかるのでやってみた。

DateTime time = DateTime.ParseExact("Thu Jan 05 09:36:00 +0000 2012",
					"ddd MMM dd HH:mm:ss zzz yyyy",
					System.Globalization.DateTimeFormatInfo.InvariantInfo,
					System.Globalization.DateTimeStyles.None);

TimeSpan span = DateTime.Now - time;
String strBefore = "";

if (span.Days > 0) {
	strBefore = "";
} else if (span.Hours > 0) {
	strBefore = " (" + span.Hours + "時間前)";
} else if (span.Minutes > 0) {
	strBefore = " (" + span.Minutes + "分前)";
} else if (span.Seconds > 0) {
	strBefore = " (" + span.Seconds + "秒前)";
} else {
	strBefore = " (現在)";
}
Console.WriteLine(time.ToString() + strBefore);

秒差がマイナスなら2012/01/06 14:36:00 (現在)
1分未満なら 2012/01/06 14:35:00 (2秒前)
1時間未満なら 2012/01/06 14:00:00 (35分前)
1日未満なら 2012/01/05 16:00:00 (22時間前)
と言った感じで表示されるかと。

Twitterのタイムラインデータ(XML)のデータにある投稿時間(created_at)の書式は
"2012/01/01 10:30:00"のようになっていないのでどう変換するのか調べてみた。
DateTime.ParseExact()を使用して、日付文字列のフォーマットを指定してあげればいいようだ。




タイムラインのデータ(一部)

<status>
 <created_at>Thu Jan 05 09:36:00 +0000 2012</created_at>
 <id>123456789123456789</id>
 <text>ツイート</text>
 <user>
  <id>123456789</id>
  <name>名前</name>
 </user>
</status>





C#でのコード(コンソールに出力)

Console.WriteLine("Thu Jan 05 09:36:00 +0000 2012");
Console.WriteLine(DateTime.ParseExact("Thu Jan 05 09:36:00 +0000 2012", 
					"ddd MMM dd HH:mm:ss zzz yyyy",
					System.Globalization.DateTimeFormatInfo.InvariantInfo,
					System.Globalization.DateTimeStyles.None).ToString());



出力結果
Thu Jan 05 09:36:00 +0000 2012
2012/01/05 18:36:00

というわけで2011年に参加したイベント・ライブがまとまりました。
トータル50個。
8月からの数がヤバイですね。。。
今年2012年は月3つ位に抑えたい所。


1. 2011/01/29 中島愛 新春スペシャル 〜 Lovely Time Travel Show 〜
2. 2011/01/30 May'n ふぁんくラ部握手会
3. 2011/02/05 May'n THE MOVIE -Phonic Nation-舞台挨拶(池袋シネマサンシャイン)
4. 2011/02/06 ワンダーフェスティバル2011冬
5. 2011/03/06 May'n Special Concert 2011「RHYTHM TANK!!」
6. 2011/03/09 初音ミクライブパーティー2011「ミクパ THANK's LIVE IN TOKYO」
7. 2011/04/16 F魂キラッ☆と大感謝祭(だいかんしゃしゃい)
8. 2011/04/16 ELISA LIVE TOUR 2011 〜Birth of my Lasei〜
9. 2011/04/30 いとうかなこ THANK YOU! TOUR 2011 原宿アストロホール
10. 2011/05/15 今井麻美 バースデーライブ2011 -at Shibuya O-EAST-
11. 2011/05/21 飛蘭 LIVE TOUR 02 -HAPPY SOUL DANCE- 横浜
12. 2011/06/04 中島愛 と〜るりーす presents Megumi Nakajima Premium Live 〜誕生日まで待てない!〜
13. 2011/06/05 中島愛 22歳感謝のまつり〜どんどこどん〜 昼の部
14. 2011/06/05 中島愛 22歳感謝のまつり〜どんどこどん〜 夜の部
15. 2011/07/02 nao 1stアルバム「prismatic infinity carat.」発売記念イベント
16. 2011/07/03 nao 1st. Live 「prismatic infinity carat. Ver.7.0.3」
17. 2011/07/18 ホリプロチャリティーコンサート「Song for you 」
18. 2011/07/30 ファンタズム PHANTASM Live 〜漆黒のミサ〜
19. 2011/08/06 nao 「prismatic infinity carat.」購入者イベント
20. 2011/08/07 ももいろクローバーZ ももクロZ@横浜BLITZ 〜選ばれしモノノフの集いVol.1〜
21. 2011/08/14 「祝!TVアニメ化記念 たまゆら祭2011 in 汐入 〜始まりの場所なので〜」
22. 2011/08/27 アニメロサマーライブ2011 rainbow 1日目
23. 2011/08/28 アニメロサマーライブ2011 rainbow 2日目
24. 2011/09/04 飛蘭 ALIVE TOUR 00 池袋サンシャインシティ噴水広場
25. 2011/09/18 TOKYO GAME SHOW 2011
26. 2011/09/24 CLAMPフェス2011 TOKYO 昼の部
27. 2011/09/24 CLAMPフェス2011 TOKYO 夜の部
28. 2011/09/30 イシの輝きはまだ終わらない!セイクリッドセブンファンイベント
29. 2011/10/04 May'n LIVE TOUR 2011 『WE ARE side-A 』横浜BLITZ
30. 2011/10/10 ホリプロタレントスカウトキャラバン決勝大会観戦
31. 2011/10/15 彩音 ワンマンライブ@Shibuya O-EAST
32. 2011/10/22 セイクリッドセブン『Report of NAITO edition』Vol.01
33. 2011/10/23 TVアニメ シュタインズ・ゲート BD/DVD購入者限定イベント
34. 2011/10/30 中島愛 「神様のいたずら」発売記念プレミアム握手会 ラクーアガーデンステージ
35. 2011/11/03 @JAM 2011
36. 2011/11/13 中島愛 カレンダー発売記念握手会 福屋書店
37. 2011/11/19 Live 5pb. 2011 東京ドームシティホール(旧JCBホール)
38. 2011/11/20 スクライド オルタレイション TAO 舞台挨拶(池袋シネマサンシャイン)
39. 2011/11/23 ANIMAX MUSIX 横浜アリーナ
40. 2011/11/27 アフィリア・サーガ・イースト ライブ&PV集 Blu-ray&DVD発売記念イベント 1回目
41. 2011/11/27 セイクリッドセブン BD第1巻購入者限定プレミアムイベント
42. 2011/11/29 May'n LIVE TOUR 2011 『WE ARE side-B 』 中野サンプラザ
43. 2011/11/30 May'n LIVE TOUR 2011 『WE ARE side-B 』 中野サンプラザ
44. 2011/12/03 NANA MIZUKI LIVE CASTLE 2011 東京ドーム
45. 2011/12/04 May'n LIVE TOUR 2011 『WE ARE side-B 』 神戸国際会館こくさいホール
46. 2011/12/10 今井麻美 3rdソロライブ 横浜BLITZ
47. 2011/12/11 中島愛ファンクラブイベント
48. 2011/12/23 アフィリア・サーガ・イースト 聖ナル2ndワンマンLive2011
49. 2011/12/25 ももいろクリスマス2011 さいたまスーパーアリーナ大会 さいたまスーパーアリーナ
50. 2011/12/31 アニソン紅白

AppStoreのランキング情報はどのように取るのか調べてみた。

iTunes Store RSS
RSS Generator

このサイトで色々取れるようだ。
以下のように指定する。

http://itunes.apple.com/jp/rss/フィードタイプ/サイズ/ジャンル

// フィードタイプ.
"topfreeapplications",			// トップ無料 iPhone
"toppaidapplications",			// トップ有料 iPhone
"topgrossingapplications",		// トップセールス iPhone
"topfreeipadapplications",		// トップ無料 iPad
"toppaidipadapplications",		// トップ有料 iPad
"topgrossingipadapplications",		// トップセールス iPad
"newapplications",			// 新規アプリ
"newfreeapplications",			// 新規無料アプリ
"newpaidapplications",			// 新規有料アプリ

// サイズ.
"limit=10",		// 10件
"limit=25",		// 25件
"limit=50",		// 50件
"limit=100",		// 100件
"limit=300",		// 300件

// ジャンル.
"xml",			// 全て
"genre=6021/xml",	// Newsstand
"genre=6016/xml",	// エンターテインメント
"genre=6014/xml",	// ゲーム
"genre=6004/xml",	// スポーツ
"genre=6005/xml",	// ソーシャルネットワーキング
"genre=6010/xml",	// ナビゲーション
"genre=6009/xml",	// ニュース
"genre=6000/xml",	// ビジネス
"genre=6015/xml",	// ファイナンス
"genre=6018/xml",	// ブック
"genre=6013/xml",	// ヘルスケア/フィットネス
"genre=6011/xml",	// ミュージック
"genre=6020/xml",	// メディカル
"genre=6002/xml",	// ユーティリティ
"genre=6012/xml",	// ライフスタイル
"genre=6007/xml",	// 仕事効率化
"genre=6008/xml",	// 写真/ビデオ
"genre=6001/xml",	// 天気
"genre=6017/xml",	// 教育
"genre=6003/xml",	// 旅行
"genre=6006/xml",	// 辞書/辞典/その他

無料トップiPhoneアプリで、すべてのジャンル、上位10件を取得する場合は以下のような指定になる
http://itunes.apple.com/jp/rss/topfreeapplications/limit=10/xml

iOS5になってから日本語キーボードの上部に予測変換のエリアが表示されるようになり、キーボードの上にツールバーを直接座標で設置していたため隠れてしまうので対応をしたのですがもっと簡単な方法があったっぽいのでメモ。


UITextView *textView;// 生成処理は省略.
UIToolbar *toolBar;// 生成処理は省略.

textView.inputAccessoryView = toolBar;

これで問題ないような気がしてきたorz