• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
 
 
7th Mon

CCCrypt

DES などの他に、 SDK 4.3 だと AES が使える。 SDK 5.X だと AES, Blowfish が使える。

Base SDK を 5.X にして Deploy Target を 4.3 にすると、Blowfish を指定してコンパイルできるが 4.3 の環境では動かないという現象になるので注意。

典型的なコードは以下の通り。

   1  
   2  void
   3  X( int p )
   4  {//エラー判定処理
   5  }
   6  
   7  NSData*
   8  DataEncryptedByAES256( NSData* p, NSData* pKey )
   9  {	size_t	wSize = ( ( p.length + kCCBlockSizeAES128 - 1 ) / kCCBlockSizeAES128 ) * kCCBlockSizeAES128;
  10  	char	v[ wSize ];
  11  	X
  12  	(	CCCrypt
  13  		(	kCCEncrypt
  14  		,	kCCAlgorithmAES128
  15  		,	kCCOptionPKCS7Padding | kCCOptionECBMode
  16  		,	pKey.bytes
  17  		,	kCCKeySizeAES256
  18  		,	NULL
  19  		,	p.bytes
  20  		,	p.length
  21  		,	v
  22  		,	wSize
  23  		,	&wSize
  24  		)
  25  	);
  26  	return [ NSData dataWithBytes:v length:wSize ];
  27  }
  28  
  29  
  30  NSData*
  31  DataEncryptedByBlowfish( NSData* p, NSData* pKey )
  32  {	size_t	wSize = ( ( p.length + kCCBlockSizeBlowfish - 1 ) / kCCBlockSizeBlowfish ) * kCCBlockSizeBlowfish;
  33  	char	v[ wSize ];
  34  	X
  35  	(	CCCrypt
  36  		(	kCCEncrypt
  37  		,	kCCAlgorithmBlowfish
  38  		,	kCCOptionPKCS7Padding | kCCOptionECBMode
  39  		,	pKey.bytes
  40  		,	pKey.length
  41  		,	NULL
  42  		,	p.bytes
  43  		,	p.length
  44  		,	v
  45  		,	wSize
  46  		,	&wSize
  47  		)
  48  	);
  49  	return [ NSData dataWithBytes:v length:wSize ];
  50  }
  51  

posted by Face Saturn on Mon 7 May 2012 at 13:13

メモリワーニングのレベルを知りたいときはこれを使う。 private なんでリジェクとされるという話もあるが、 ソースがオープンなんで大丈夫では?次回のリリースでは 試しに入れてみよう。

で、使い方

   1  
   2  #include <libkern/OSMemoryNotification.h>
   3  
   4  
   5  -	(void)
   6  applicationDidReceiveMemoryWarning:(UIApplication*)p
   7  {	NSLog( @"applicationDidReceiveMemoryWarning:Level:%d", OSMemoryNotificationCurrentLevel() );
   8  }
   9  

ソースは http://www.opensource.apple.com/source/Libc/Libc-498.1.7/sys/OSMemoryNotification.c

posted by Face Saturn on Fri 8 Apr 2011 at 08:18

UINavigationController の view をUIWindow に直接つけて、そのサイズを変更しようとすると、status bar のサイズ分、ナビゲーションバーとかぶってしまう。 一つビュコントローラを噛ませれば大丈夫。

posted by Face Saturn on Wed 23 Mar 2011 at 09:28
21st Mon

CGImageAlphaInfo

リファレンスでは kCGImageAlphaNone は kCGImageAlphaNoneSkipLast と equivalent とあるけど、CGBitmapContextCreate の bitmapInfo パラメータに渡すときの挙動は違う。 bitsPerComponent が 8 のときに kCGImageAlphaNone を渡すと 1 Pixel あたり 3 バイト、 kCGImageAlphaNoneSkipLast を渡すと 1 Pixel あたり 4 バイト、 で計算した値を bytesPerRow に渡してやる必要がある。

posted by Face Saturn on Mon 21 Feb 2011 at 16:20

UIViewControllr は IB で nib の名前を指定しないと自動的にクラス名と同じ名前+'.nib' をロードするようだが、UITableViewController はこれをやらないので、nib から読むときは必ず nib 名を指定しなくてはいけない。

posted by Face Saturn on Mon 21 Feb 2011 at 05:20

長いジョブを実行中に UIActivityIndicatorView を表示したい場合。UIActivityIndicatorView は一旦 currentRunLoop に戻らないと表示されないので、以下のようにジョブをくくっても表示されない。

   1  	UIActivityIndicatorView* wAI = [ [ [ UIActivityIndicatorView alloc ] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge ] autorelease ];
   2  	[ [ UIApplication sharedApplication ].keyWindow addSubview:wAI ];
   3  	wAI.center = CGPointMake( 160, 240 );
   4  	[ wAI startAnimating ];
   5  	[ self 長いジョブ ];
   6  	[ wAI removeFromSuperview ];
   7  

表示させるための一つ目のアイディアは以下のように currentRunLoop を一瞬だけ動かす方法。

   1  	[ wAI startAnimating ];
   2  	[ NSRunLoop.currentRunLoop runUntilDate:[ NSDate dateWithTimeIntervalSinceNow:0.0 ] ];
   3  	[ self LongJob ];

2つ目のアイディアはジョブとインディケータを currentRunLoop に戻ったあと動くようにスケジュールすること。

   1  	wAI.startAnimating;
   2  	[ self performSelector:@selector(LongJob) withObject:nil afterDelay:0 ];
   3  	[ wAI performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0 ];
   4  

ネットで別スレッドでやってる例をよく見るが、その必要はない。 単に currentRunLoop が動けばいい。 別スレッドにするとしたら、長いジョブの方。

posted by Face Saturn on Wed 12 Jan 2011 at 04:07

UITabBarController を使っていて、タブが6個以上になると自動的に「more」(plist の Localization native development region の値により文言は変化)というタブが現れ、そのテーブルビュー経由で5番目以降のビューはアクセスされる。

すなわち5番目以降のビューは UINavigationView aware でなくてはならない。

で、more に戻る backBarButtomItem をカスタマイズの仕方。

self が UITabBarController だとして

方法1、文言だけの変更

   1  	self.moreNavigationController.rootViewController.title = @"HOKA";
   2  

方法2、イメージを貼る

   1  	self.moreNavigationController.rootViewController.navigationItem.backBarButtonItem = [ [ [ UIBarButtonItem alloc ] initWithImage:[ UIImage imageNamed:@"0.png" ] style:UIBarButtonItemStyleBordered target:nil action:nil ] autorelease ];
   2  

posted by Face Saturn on Wed 8 Dec 2010 at 06:09

複数の矩形の和を求めていくとき、初期値には CGRectNull を使うといい。

CGRect v = CGRectNull; for ( UIView* w in self.subviews ) v = CGRectUnion( v, w.frame );

CGRectZero は大きさ0の領域を持ってしまうので使えない。

CGRectUnion( CGRectNull, CGRectMake( 10, 10, 10, 10 ) )ー>10,10-10,10

CGRectUnion( CGRectZero, CGRectMake( 10, 10, 10, 10 ) )ー>0,0-20,20

posted by Face Saturn on Tue 30 Nov 2010 at 09:33

applicationDidEnterBackground の中から beginBackgroundTaskWithExpirationHandler を呼ぶと backgroundTimeRemaining は 600 秒にセットされる(ことが多い?) これをすぎても実行していると、先のポストと同様に終了させられる。

デバッガで実行していると、GCD でバックグラウンドジョブを投入した場合はちゃんと終了させられてしまうのだが、performSelector でバックグラウンドジョブを投入した場合は、生き残ってしまう(backgroundTimeRemaining がマイナスになって動き続ける)ので、必ず Organizer の Console で確認。

ちなみに1秒毎にログを出力してスリープするような軽いジョブを投入したらタイムアウトでサスペンドに移行した。 また延々素数を計算するようなジョブを投入するとタイムアウトで Kill された。

posted by Face Saturn on Thu 25 Nov 2010 at 02:51

アプリケーションがバックグラウンドに入ったときアプリケーションのbackgroundTimeRemaining プロパティで示される残り時間が 0 になる前に処理を終えなくてはならない。この値は最初 10 秒にセットされている(ことが多い?) 処理を終えないとこんな感じで終わらせられる。

Thu Nov 25 11:30:01 xxxxx-no-iPhone BT[4821] : Remain:0.683624 100000127 is prime

Thu Nov 25 11:30:02 xxxxx-no-iPhone SpringBoard[1557] : BT[4821] has active assertions beyond permitted time: {( identifier: Suspending process: BT[4821] permittedBackgroundDuration: 10.000000 reason: suspend owner pid:1557 preventSuspend preventThrottleDownCPU preventThrottleDownUI )}

Thu Nov 25 11:30:02 xxxxx-no-iPhone SpringBoard[1557] : Forcing crash report of BT[4821]...

Thu Nov 25 11:30:02 xxxxx-no-iPhone SpringBoard[1557] : Finished crash reporting.

Thu Nov 25 11:30:02 xxxxx-no-iPhone com.apple.launchd[1] (UIKitApplication:jp.co.xxxxx.BT[0xc343][4821]) : (UIKitApplication:jp.co.xxxxx.BT[0xc343]) Exited: Killed

Thu Nov 25 11:30:02 xxxxx-no-iPhone SpringBoard[1557] : Application 'BT' exited abnormally with signal 9: Killed

Thu Nov 25 11:30:02 xxxxx-no-iPhone ReportCrash[4830] : Saved crashreport to /var/mobile/Library/Logs/CrashReporter/BT_2010-11-25-113002_xxxxx-no-iPhone.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0

posted by Face Saturn on Thu 25 Nov 2010 at 02:45
Contents
CCCrypt
OSMemoryNotificationCurrentLevel()
UINavigationController
CGImageAlphaInfo
UITableViewController in XIB
UIActivityIndicatorView
moreViewController へ戻る tabBarItem
CGRectNull,CGRectZero
beginBackgroundTaskWithExpirationHandler
applicationDidEnterBackground
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ