Question: I'm trying to developed a really simple browser to be part of an iPad app. That browser will have tabs. All tabs are based on a .xib with an `UIWebView` filling almost all .xib frame.
I store all them inside an `NSMutableArray`, called `tabsArray`.

So, here's how I add a new tab to the array:
declaration:

.h

```
@property (nonatomic,strong) NSMutableArray *tabsArray;
@property (nonatomic,strong) UIDetailWebController *pagina;

```

.m

```
self.pagina = [[UIDetailWebController alloc] initWithNibName:@"UIDetailWebController" bundle:nil];
[tabsArray insertObject:pagina atIndex:currentViewTag+1];

```

how I display it on screen:

```
[self.view addSubview:[[tabsArray objectAtIndex:currentViewTag+1] view]];

```

And, finally, here's how I'm trying to "release" the UIWebView when user closes a tab (with a specific index):

```
[[[tabsArray objectAtIndex:index] view] removeFromSuperview];
[[tabsArray objectAtIndex:index] setWebView:nil];
[[tabsArray objectAtIndex:index] setView:nil];
[tabsArray removeObjectAtIndex:index];

```

My problem is: It appears that by doing this I simply don't release it. Memory consumption keeps the same, and If I'm playing an youtube video, the audio continues to play.
I'm kind of new on programming, and started iOS development by iOS 5, with ARC, so probably I'm letting slide some basic detail related to memory management. 

SOLUTION:

Ok, I found out that what was retaining webview was the implementation of PullToRefreshView (https://github.com/chpwn/PullToRefreshView). When I set it's delegate to nil; everything just works!

Answer: 
As Romain Guy explained a while back during the Google I/O session, the most efficient way to only update one view in a list view is something like the following (this one update the whole view data):

```
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
    if(target==list.getItemAtPosition(i)){
        View view = list.getChildAt(i-start);
        list.getAdapter().getView(i, view, list);
        break;
    }

```

Assuming `target` is one item of the adapter.

This code retrieve the `ListView`, then browse the currently shown views, compare the `target` item you are looking for with each displayed view items, and if your target is among those, get the enclosing view and execute the adapter `getView` on that view to refresh the display.

As a side note `invalidate` doesn't work like some people expect and will not refresh the view like getView does, `notifyDataSetChanged` will rebuild the whole list and end up calling `getview` for every displayed items and `invalidateViews` will also affect a bunch.

One last thing, one can also get extra performance if he only needs to change a child of a row view and not the whole row like `getView` does. In that case, the following code can replace `list.getAdapter().getView(i, view, list);` (example to change a `TextView` text):

```
((TextView)view.findViewById(R.id.myid)).setText("some new text");

```

In code we trust.
Method `notifyDataSetChanged` force to call `getView` method to all visible elements of the `ListView`. If you want update only 1 specific item of the `ListView` you need to path this item to the `AsynhTask`.