iPhoneアプリケーションでスキャンビルドコードアナライザーを実行して問題をチェックするスクリプトをターミナルで実行しています。偶然にも、deallocメソッドでリリースされていないIBOutletivarが見つからないインスタンスが少なくとも1つあることに気づきました。
ターミナルから実行するコマンドの内容は次のとおりです。
#!/bin/sh
cd /Developer/svn/MyCompany/iPhone/MyApplication
scan-build -analyzer-check-dead-stores -analyzer-check-llvm-conventions -analyzer-check-objc-mem -analyzer-check-objc-methodsigs -analyzer-check-objc-missing-dealloc -analyzer-check-objc-unused-ivars -analyzer-check-security-syntactic --experimental-checks -k -V -o scan-reports xcodebuild -configuration Debug -sdk iphonesimulator4.2 clean build
最新バージョンのチェッカーにアップデートしたので、新しいバージョンのチェッカーがあるとは限りません。これが私のクラスの.hファイルの関連部分です:
@interface LoginWizardUsernameViewController : UIViewController <UITextFieldDelegate, GetUserExistsDidFinish> {
IBOutlet UITextField *username;
IBOutlet UIActivityIndicatorView *activityIndicatorView;
}
@property (nonatomic, retain) UITextField *username;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicatorView;
そして、ここに.mファイルの関連部分があります:
// lots o' code omitted here
@implementation LoginWizardUsernameViewController
@synthesize username;
@synthesize activityIndicatorView;
- (void)dealloc
{
[super dealloc];
}
ご覧のとおり、2つのIBOutletアイテムのリリースはありませんが、プロパティ定義に保持されているものとしてリストされていても、チェッカーは何らかの理由でこれを認識していません。奇妙なことに、他のクラスの.mファイルに移動して、deallocメソッドでリリースをコメント化すると、問題のスキャンの最後にscan-buildが喜んで警告します。この特定の状況について何が違うのか理解できません。