NSArray вызывает утечку памяти при симуляции предупреждения о нехватке памяти - PullRequest
0 голосов
/ 27 мая 2011

Я сделал пример проекта, который воспроизводит эту проблему, которая содержит два представления:

корневой заголовок:

#import <UIKit/UIKit.h>
#import "view2.h"

@interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{
    view2 *secondView;
    UITableView *table;
    NSArray *array;
}

@property (nonatomic, retain) view2 *secondView;
@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) NSArray *array;
@end

root main:

#import "RootViewController.h"

@implementation RootViewController
@synthesize table, array, secondView;

- (void)viewDidLoad
{
    [super viewDidLoad];    
    if(self.array == nil){
        self.array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
    }
}
- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    table = nil;
    array = nil;
    secondView = nil;

}

- (void)dealloc
{
    [table release];
    [array release];
    [secondView release];
    [super dealloc];
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

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

    cell.textLabel.text = [array objectAtIndex:indexPath.row];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if (secondView == nil) {
        secondView = [[view2 alloc] init];
    }
    [self.navigationController pushViewController:secondView animated:YES]; 
}
@end

view2 simpleсодержит метку с текстом «view 2» для идентификации.Весь этот код делает в корневом контроллере создание массива со значениями 1,2,3,4 и привязывает этот текст как строки к таблице, щелкая любую строку, помещая представление 2 в стек.если вы загружаете приложение в симуляторе с помощью инструмента инструментов утечки, щелкните любую строку, чтобы отобразить view2, а затем смоделируйте предупреждение об ошибке, появятся следующие утечки: image для строки:

self.array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];

это вызывает у меня много проблем в моем основном приложении, так как я использую массивы для представления данных в таблицах повсюду.

Я пробовал различные способы исправить это, например, объявитьМассив по-разному безрезультатно.

любая помощь очень ценится!

спасибо

1 Ответ

5 голосов
/ 27 мая 2011

В viewDidUnload вы путаете собственность с прямым доступом к ивару.

array = nil просто устанавливает ivar на nil без использования метода синтезированного метода доступа. Вы должны использовать точечную запись: self.array = nil;

Таким образом, используется метод доступа setArray:, который управляет памятью.

Смешивание иваров и свойств является частой проблемой среди новичков в Objective-C. Путаницу можно легко предотвратить, всегда используя разные имена свойств и ivars:

@synthesize array = _array;

Вы можете просто пропустить объявление ivar в классе @interface или назвать его как в директиве @synthesize.

...