iOS - Почему мой NSURL не сохраняется в методе init? - PullRequest
1 голос
/ 31 января 2012

Я создаю новый UIViewController с 2 свойствами:

@property (retain, nonatomic) NSURL *url;
@property (retain, nonatomic) NSString *title;

и синтезирован:

@synthesize url = _url;
@synthesize title = _title;

в моем пользовательском методе инициализации, я не использую сеттер, как памятьРуководство по управлению говорит, но когда мне нужно использовать свойства в 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];
}

. Я вижу свой заголовок, но мое веб-представление пусто.Если я использую self.url в init, он работает!

У вас есть идея?

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 ]

4 голосов
/ 31 января 2012

вы устанавливаете свойства как сохраняемые, но это применимо, только если вы используете синтезированные геттеры.Установив значение непосредственно на ivar, вы обойдете это, и значение не будет сохранено

, которое вы должны делать (вероятно, не очень хороший способ, когда у вас уже есть сеттеры):

_url = [url retain];

или лучше:

self.url = url;

или даже лучше, как сказал Мэтт в комментариях: используйте ARC

1 голос
/ 31 января 2012

Вы должны сохранить URL-адрес, используя:

self.url = url;

в методе init, или вызовите retain после назначения URL-адреса в методе init следующим образом.

_url = url;
[_url retain];
1 голос
/ 31 января 2012

Что ж, если вы пишете пользовательский метод init, вам нужно сохранить себя:

- (id)initWithURL:(NSURL *)url andTitle:(NSString *)titleTemp
{
    self = [super initWithNibName:@"navigatorViewController" bundle:nil];
    if (self) {
        _url = [url retain];
        _title = [titleTemp retain];
    }
    return self;
}

То, что он работал с заголовком, просто означает, что переменная, вероятно, будет выпущена позже, чем NSURLпроходит в методе init.

1 голос
/ 31 января 2012

Вам нужно добавить ссылку (для чего вы держите ), используя copy или retain:

_url = [url copy];
_title = [titleTemp copy];

или

_url = [url retain];
_title = [titleTemp retain];
...