2012-06-20 69 views
0

我在我的视图控制器中有一个NSURL成员。基于用户按下哪个按钮等用户输入,我必须动态获取url字符串并创建一个NSURL对象。动态更改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 

回答

0

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

就这样

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

这也将分配一个'NSURL'对象,不是吗? – sergio

+0

没有分配的对象将是autoRelease,你不需要为该对象而烦恼。 – Rajkumar

+0

我认为这样的自动释放对象是由编译器本身维护的,并且该程序不拥有这样的对象。 – Rajkumar

0

如果self.NavigationURLretain(或者,如果你正在使用ARC strong)属性,那么有没有在为你做的问题。事实上,分配给该属性会自动处理你的内存管理,你将不会有内存泄漏。

如果你不使用ARC和你的财产是retain一个,不过,你必须提防使你的对象的autoreleased之一:

self.NavigationURL = [[[NSURL alloc] initWithString:@"https://zzzqmsdb.xxxxyyyy.com/sites/pex/iPadFiles/CommAndCoord.pdf"] autorelease];   
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; 
}