iOS - 为什么我的NSURL不会保留在init方法中?

时间:2012-01-31 14:05:46

标签: iphone objective-c ios memory-management nsurl

我正在创建一个包含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];

非常感谢

4 个答案:

答案 0 :(得分:4)

您将属性设置为保留,但这仅适用于使用合成的getter的情况。通过直接在ivar上设置值,您将绕过此值并且不保留该值

你应该这样做(当你已经有了制定者时,这可能不是一个好方法):

_url = [url retain];

或更好:

self.url = url;

甚至更好,因为亚特在评论中说:使用ARC

答案 1 :(得分:1)

您需要使用copyretain添加引用(针对持有的内容):

_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];