我正在创建一个包含2个属性的新UIViewController:
@property (retain, nonatomic) NSURL *url;
@property (retain, nonatomic) NSString *title;
并合成:
@synthesize url = _url;
@synthesize title = _title;
在我的自定义初始化方法中,我没有像内存管理指南那样使用setter,但是当我需要使用viewDidLoad中的属性时,url似乎是空的,标题不是
- (id)initWithURL:(NSURL *)url andTitle:(NSString *)titleTemp
{
self = [super initWithNibName:@"navigatorViewController" bundle:nil];
if (self) {
_url = url;
_title = titleTemp;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[_titreBarButtonItem setTitle:_title];
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:_url];
[_webView loadRequest:urlRequest];
[urlRequest release];
}
我可以看到我的标题,但我的网页视图是空白的。 如果我在init中使用self.url,那就可以了!
你有什么想法吗?
PS:以下是我如何调用我的init:
NSString *urlString = [[[NSBundle mainBundle] pathForResource:@"infos" ofType:@"html"] copy];
NSURL *url = [[NSURL alloc] initFileURLWithPath:urlString];
[urlString release];
navigatorViewController *navigatorVC = [[navigatorViewController alloc] initWithURL:url andTitle:@"Infos"];
[url release];
[self presentViewController:navigatorVC animated:YES completion:nil];
[navigatorVC release];
非常感谢
答案 0 :(得分:4)
您将属性设置为保留,但这仅适用于使用合成的getter的情况。通过直接在ivar上设置值,您将绕过此值并且不保留该值
你应该这样做(当你已经有了制定者时,这可能不是一个好方法):
_url = [url retain];
或更好:
self.url = url;
甚至更好,因为亚特在评论中说:使用ARC
答案 1 :(得分:1)
您需要使用copy
或retain
添加引用(针对持有的内容):
_url = [url copy];
_title = [titleTemp copy];
或
_url = [url retain];
_title = [titleTemp retain];
答案 2 :(得分:1)
如果您编写自定义init
方法,那么您需要保留自己:
- (id)initWithURL:(NSURL *)url andTitle:(NSString *)titleTemp
{
self = [super initWithNibName:@"navigatorViewController" bundle:nil];
if (self) {
_url = [url retain];
_title = [titleTemp retain];
}
return self;
}
它与title一起工作只是变量可能会在init方法中传递NSURL
之后发布。
答案 3 :(得分:1)
您必须使用以下网址保留网址:
self.url = url;
在init方法中或在init方法中分配url后调用retain。
_url = url;
[_url retain];