前些日子在项目中因为误用了单例而导致了一系列问题。原来在objective-c中的单例并没有java或者C#那么简单的实现,这里记录下;
问题是这样被发现的,在对于一个UIViewController进行pop时并没有被dealloc,导致了内存泄露。问题代码类似于下面的:
//LWChatViewController.h @interface LWChatViewController : LWTableViewController <LWObjSelectViewDelegate>{ UINavigationController *root; } @property (nonatomic, retain) UINavigationController *root; @end //LWChatViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. self.root = LWNavigationController; }这里的LWNavigationController是一个顶级的单例。
问题就出在@property (nonatomic, retain) 这里root居然是一个retain的对象指针,在这里retain一个static的单例将导致内存泄露,MD,这个bug找的我好久。。。
解决这个问题其实很简单,把retain改为assign就行了,但这样如果在协作编程的时候如果别人不在意这个是单例直接进行常规操作的话会带来很大的问题。
继续,我们来从根本上解决这个问题。
我们需要重写一些方法:
- (id)retain { return self; } - (NSUInteger) retainCount { return NSUIntegerMax; } - (void) release { // do nothing } - (id)autorelease { return self; }