您能否告诉我以下代码是否100%正确?特别是dealloc
部分
的 FirstViewController.h 的
#import <UIKit/UIKit.h>
#import "SecondViewController.h"
@class SecondViewController
@interface FirstViewController : UIViewController
{
SecondViewController *SecondController;
}
- (IBAction)SwitchView;
@property (nonatomic, retain) IBOutlet SecondViewController *SecondController;
@end
的 FirstViewController.m 的
#import "FirstViewController.h"
@implementation FirstViewController
@synthesize SecondController;
- (IBAction)SwitchView
{
SecondController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
[self presentModalViewController:SecondController animated:YES];
[SecondController release];
}
/// OTHER CODE HERE ///
- (void)dealloc
{
[SecondController release];
[super dealloc];
}
@end
谢谢!
答案 0 :(得分:8)
不,这不对。您正在将release
消息发送到dealloc
中的指针,但指针可能会或可能不会指向SecondController。这可能会导致一些非常奇怪的错误,通常是随机对象被释放。
在objective-c术语中,您的类不会保留(认为“拥有”)SecondController,因此它不应该尝试在dealloc
上首先释放它。
要以正确的方式声明和释放所有权,请执行以下操作:
- (IBAction)SwitchView
{
self.SecondController = [[[SecondViewController alloc]
initWithNibName:@"SecondViewController" bundle:nil] autorelease];
self.SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
[self presentModalViewController:self.SecondController animated:YES];
}
/// OTHER CODE HERE ///
- (void)dealloc
{
self.SecondController = nil;
[super dealloc];
}
这也可以保护您免受SwitchView
和dealloc
之间发生的任何其他事情的侵害。 (只要该内容遵循规则并使用self.SecondController = ...
来更改属性)
在SwitchView
中,alloc
/ autorelease
序列使您的例程保持对例程长度的所有权(稍微超出)。 self.SecondController =
部分确保您的类保留SecondController
对象,因为您声明了它(nonatomic,retain)
。
答案 1 :(得分:4)
您应该使用属性设置器来指定SecondController
。
我建议您仅alloc/init
查看控制器一次,然后在SwitchView
中显示:
#import "FirstViewController.h"
@implementation FirstViewController
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if((self = [super initWithNibName:nibName bundle:nibBundle])) {
self.SecondController = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
}
return self;
}
- (IBAction)SwitchView
{
[self presentModalViewController:SecondController animated:YES];
}
/// OTHER CODE HERE ///
- (void)dealloc
{
[SecondController release];
[super dealloc];
}
@end
这样,您实际上只创建了一次SecondController
视图控制器,而不是每次调用-SwitchView
时都创建它。