結論:如果有一個實例A是用工廠方法創建或被聲明爲autorelease的,則當代碼執行到跳出這一實例化A的代碼塊(例如一個function)且實例A並沒有被保留(retain)下來時,實例A的指針所指向的內容將被釋放。
示例:
#import "ViewController.h"
#import "TestViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 1、被聲明爲autorelease的視圖控制器
testVC = [[[TestViewController alloc] initWithNibName:nil bundle:nil] autorelease];
[self.view insertSubview:testVC.view atIndex:0];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 2、向已經被釋放的視圖控制器發送消息,引起了crash
- (IBAction)buttonClicked:(id)sender
{
[testVC doSomething];
}
@end