0

我的视图控制器中有一个NSURL成员。根据用户输入,比如用户按下了哪个按钮,我必须动态获取 url 字符串并创建一个NSURL对象。

目前每次我创建一个NSURL对象。我知道这是内存泄漏。有什么方法可以更改NSRUL成员的 url 字符串值而不删除其内存?

NSURL由于项目正在进行,我无法释放成员@autoreleasepool


代码片段:

@interface myViewController : UIViewController <MyWebViewDelegate>
{
     NSURL* NavigationURL;

         ...
}

@implementation myViewController

...

-(IBAction) LoadURL
{
    if (self.NavigationURL)
    {
        NSURLRequest *Request = [NSURLRequest requestWithURL:NavigationURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
        [WebView loadRequest:Request];
    }
}


- (IBAction)onHomeClick:(UIButton *)sender 
{ 
    switch (sender.tag) 
    {
        case 101: 
            {
                self.NavigationURL = [[NSURL alloc] initWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/CommAndCoord.pdf"];        
                [self LoadURL];
            }
            break;

        case 102: 
            {
                [self stopResourcesIfAlreadyLoading];

                self.NavigationURL = [[NSURL alloc] initWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/PartCulture.pdf"];        

                [self LoadURL];
            }
            break;
}
@end
4

3 回答 3

0

如果self.NavigationURLretain(或者如果您正在使用 ARC strong)属性,那么按照您的方式行事就没有问题。实际上,分配给该属性将自动为您处理内存管理,并且您不会有内存泄漏。

但是,如果您不使用 ARC 并且您的属性是一个retain,那么您必须注意不要让您的对象成为autoreleased一个:

self.NavigationURL = [[[NSURL alloc] initWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/CommAndCoord.pdf"] autorelease];        
于 2012-06-20T11:02:09.307 回答
0

您可以使用 [NSUrl URLWithString:] 方法而不是每次都分配它。

像这样

self.NavigationURL = [NSURL URLWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/PartCulture.pdf"];  
于 2012-06-20T11:03:48.060 回答
0

用这个:

  -(void)LoadURL:(NSURL *)url
{
if (urlL)
{
    NSURLRequest *Request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    [WebView loadRequest:Request];
}
}


- (IBAction)onHomeClick:(UIButton *)sender 
{
switch (sender.tag) 
{
    case 101: 
        {
            self.NavigationURL = [NSURL URLWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/CommAndCoord.pdf"];        
            [self LoadURL:self.NavigationURL];
        }
        break;

    case 102: 
        {
            [self stopResourcesIfAlreadyLoading];

            self.NavigationURL = [NSURL URLWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/PartCulture.pdf"];        

            [self LoadURL:self.NavigationURL];
        }
        break;
 }
于 2012-06-20T11:08:17.873 回答