我有一个在终端中运行的脚本,它在我的 iPhone 应用程序上运行扫描构建代码分析器以检查问题。我只是很偶然地注意到,至少有一个实例没有找到未在 dealloc 方法中释放的 IBOutlet ivar。
这是我从终端运行的命令的内容:
#!/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
我已经更新到最新版本的 checker,所以不可能有更新版本的 checker。以下是我班级的 .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];
}
如您所见,这两个 IBOutlet 项目没有发布,但即使它们在属性定义中列为保留,检查器由于某种原因没有看到这一点。奇怪的是,我可以去其他类的.m文件,在dealloc方法中注释掉一个release,scan-build在问题扫描结束时愉快地提醒我。我只是无法弄清楚这种特殊情况有什么不同。