iPadかどうか判別する

[[UIDevice currentDevice] isWildcat]
でもいいんですが、無駄にPrivate API使うのも危険なので(とは言えAppleのコードではかなり使われているのでこれの仕様が変わったり無くなったりする事はほぼ無いんじゃないかとは思いますが)、最近良く見かける下記のやり方の方が良さそう。
static BOOL IsPad(void)
{
    return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
}

これも安心のiOS 3.2+

画面が縦なのか横なのかを判別する

これまで色々なメソッド使ってみたりしましたが、これ以上ない正解に辿りついたのでメモ。

static BOOL IsLandscape(void)
{
    return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}

ちなみにステータスバーが非表示でも大丈夫みたいです。
Available in iOS 2.0 or higherの安心設計。

BundleIdentifierSearcher

あのアプリを買っていないのだけれど、tweak作成にあたってBundleIdentifierを知りたい・・・。そんな貴兄におくるBundleIdentifierSearcher!



検索してダブルクリックするとBundleIdentifierをコピーできます。NSJSONSerializationクラスとNSArray, NSDictionaryのModern Objective-C Literal Syntaxを使っているのでOS X 10.7+が必要です。
iOS 5からのTwitter連携用に作られたのでしょうけど、JSON扱えるクラスがFoundationにあって助かった。

バイナリはこちら
ソースはgithubに。

自動retainされないNSMutableSet

addObjectしてもretainされないNSMutableSetを作る。使い所はグローバル変数のstatic NSMutableSet *でこれを使って特定クラスのオブジェクトを詰め込んでいって、あるタイミングで全インスタンスに対して何か処理をする為。retainさせないのはreleaseタイミングはデフォルトのままにするため。まぁaddObjectしたらすぐにreleaseするのと大差ないんだけどね(その場合もSEGVには注意しないといけない)。

CFSetCallBacks assignCallbacks = kCFTypeSetCallBacks;
assignCallbacks.retain = NULL;
assignCallbacks.release = NULL;
NSMutableSet *assignSet = (NSMutableSet *)CFSetCreateMutable(kCFAllocatorDefault, 0, &assignCallbacks);

これで[assignSet addObject:obj];してもobjのretainCountは増えない。解放されたオブジェクトを触るとSEGVになるので、以下のようにaddするオブジェクトのクラスにおけるdeallocの中で外す。

- (void)dealloc
{
        if ([assignSet containsObject:self])
                [assignSet removeObject:self];
        [super dealloc];  // %orig;
}
上記のようにdeallocいじらないといけないので、単一のクラスのオブジェクトを詰め込む場合以外ぐらいに留めておくのがよさそう。

参考 http://decafish.blog.so-net.ne.jp/2010-10-27-1