Утечка памяти в iPhone, похоже, вышла из-под контроля - PullRequest
0 голосов
/ 06 июня 2009

Итак, я делаю очень простое приложение для Twitter (на самом деле это Presence 2 из курса iPhone в Стэнфорде, который находится на iTunes), когда я решил, что хочу посмотреть, не протекает ли мое приложение. Итак, я запустил Leaks, и он сразу нашел его. Но когда я смотрю на трассировку стека, возникает утечка в основной функции, когда я вызываю UIApplicationMain.

На рисунке ниже показана трассировка стека от инструментов и соответствующий код в xcode. Кто-нибудь знает, как я могу остановить эту утечку и почему это происходит?

альтернативный текст http://img193.imageshack.us/img193/1237/picture2fnj.png

РЕДАКТИРОВАТЬ: Хорошо, я искал и искал и нашел, где проблема, но я все еще не знаю, что происходит. Я включил источник для TableViewController, с которым у меня проблемы.

Утечка происходит, когда я устанавливаю cell.text равным [names objectAtIndex: indexPath.row]. Что интересно, так это то, что NSIndexPath как-то протекает. Как мне управлять памятью с помощью метода objectAtIndex?

Является ли редактирование моего вопроса постом лучшим способом ответа? Или я должен был оставить свой код в комментарии?

@implementation PersonListTableViewController


- (id)initWithStyle:(UITableViewStyle)style 
{
    if (self = [super initWithStyle:style])
    {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"TwitterUsers" ofType:@"plist"];  
    names = [[NSArray alloc] initWithContentsOfFile:path];
    }
    return self;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{   
    return 0;
    //return [names count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [names objectAtIndex:indexPath.row];

    return cell;
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryDisclosureIndicator;
}


- (void)dealloc {
    [names release];
    [super dealloc];
}


@end

Ответы [ 3 ]

1 голос
/ 06 июня 2009

Вы запускаете инструменты на устройстве или на симуляторе? Я обнаружил, что проблемы с памятью могут быть разными между ними.

0 голосов
/ 06 июня 2009

Начните с основ. Убедитесь, что вы отпускаете все элементы управления пользовательского интерфейса и бизнес-объекты в первом загруженном объекте. Убедитесь, что все ресурсы во время инициализации правильно высвобождены, а затем убедитесь, что вы правильно устанавливаете вещи. Вы используете шаблон как?:

UIButton *btn = [[UIButton alloc] init]; //not really complete...
myObj.myButton = btn;
[btn release]

В конце концов, если больше ничего не наступит через код в вашем уме и определите, когда что-то происходит alloc, а затем определите точную точку, в которой это происходит. Если вы не можете определить, где находится release, возможно, вы обнаружили утечку памяти. Найдите решение и повторите тестирование. Чтобы идентифицировать каждую утечку, требуется время. Я всегда предполагаю, что есть несколько источников, пока они или это не будут решены.

Как упоминает Энди, если вам нужна более прямая помощь, вам нужно будет опубликовать больше кода.

0 голосов
/ 06 июня 2009

В коде вашего приложения есть что-то утечка. Функция UIApplicationMain является точкой входа в трассировку стека, если вы будете следовать вызовам в коде своего приложения, именно здесь вы найдете утечку.

Если вы можете определить метод, который, по-видимому, имеет утечку, вы можете опубликовать этот код, и кто-то может помочь вам.

...