Утечка памяти Obj-C UIActionSheet iPhone - PullRequest
1 голос
/ 08 марта 2011

Я кодирую всплывающий экран, который будет отображаться, если значение mulValue в настройках равно nil. Вот код:

#import "FirstViewController.h"

@implementation FirstViewController

@synthesize myHelpfile = ivHelpfile; //UIAlertView
@synthesize myAboutfile = ivAboutfile; //UIAlertView
@synthesize myNoarea = ivNoarea; //UIAlertView
@synthesize myMap = ivMap; //UIImageView
@synthesize myAreapick = ivAreapick; //UIActionSheet
@synthesize myAdvancedmode = ivAdvancedmode; //NSString
@synthesize myAreaset = ivAreaset; //NSString
@synthesize myAreaarray = ivAreaarray; //NSArray

@synthesize appSettingsViewController, settingsViewController;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Wildlife";

    NSString *area  = [[NSUserDefaults standardUserDefaults] stringForKey:@"mulValue"];
    [self setMyAreaset:area];

    if ([self myAreaset] == nil) { //check if any region is selected. If not, push UIActionsheet

    NSArray *array = [[NSArray alloc] initWithObjects:      // creating array for different regions
                       [NSString stringWithString:@"Region 1"],
                       [NSString stringWithString:@"Region 2"],
                       [NSString stringWithString:@"Region 3"],
                       [NSString stringWithString:@"Region 4"],
                       [NSString stringWithString:@"Region 5"],
                       [NSString stringWithString:@"Region 6"],nil];
    [self setMyAreaarray:array];
    [array release], array = nil;       
    NSLog(@"Built areaselectArray");
    NSLog(@"Values of areaselectArray are %@",[self myAreaarray]);

    UIActionSheet *areaselect = [[UIActionSheet alloc] initWithTitle:@"Select your current area" //creation of popup Area Selection
                                                            delegate:self 
                                                   cancelButtonTitle:nil 
                                              destructiveButtonTitle:nil 
                                                   otherButtonTitles:nil];
        [self setMyAreapick:areaselect];
        [areaselect release], areaselect = nil;

    int countarray = [[self myAreaarray] count];

    for (int i = 0; i < countarray; i++) { //building list from array

        [[self myAreapick] addButtonWithTitle:[[self myAreaarray] objectAtIndex:i]];

    }
    [[self myAreapick] addButtonWithTitle:@"Cancel"];
    [self myAreapick].cancelButtonIndex = countarray;
    [[self myAreapick] showInView:self.view];//show the general UIActionSheet instance
    NSLog(@"Out of viewDidLoad");
    }
    else {
        NSLog(@"Area is %@, no need for areaselectArray",area);
        }   

}


-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger )buttonIndex
{
    int countarray = [[self myAreaarray] count];

    if (buttonIndex != countarray) { //cancel button is at countarray, so for anything that is not cancel, do:
            NSString *area = [[self myAreaarray] objectAtIndex:(buttonIndex)];
            [self setMyAreaset:area];
            [[NSUserDefaults standardUserDefaults] setObject:[self myAreaset] forKey:@"mulValue"];
            [[NSUserDefaults standardUserDefaults] synchronize]; //sync
            NSLog(@"Released areaselectArray");
        }
    else {
    }

}

И в моем FirstViewController.h у меня есть:

@interface FirstViewController : UIViewController <UIActionSheetDelegate, IASKSettingsDelegate, UIAlertViewDelegate> {
    UIAlertView *ivHelpfile;
    UIAlertView *ivAboutfile;
    UIAlertView *ivNoarea;
    UIActionSheet *ivAreapick;
    UIImageView *ivMap;
    NSString *ivAdvancedmode;
    NSString *ivAreaset;
    NSArray *ivAreaarray;

}

@property(nonatomic, retain) UIAlertView *myHelpfile;
@property(nonatomic, retain) UIAlertView *myAboutfile;
@property(nonatomic, retain) UIAlertView *myNoarea;
@property(nonatomic, retain) UIActionSheet *myAreapick;
@property(nonatomic, retain) UIImageView *myMap;
@property(nonatomic, copy) NSString *myAdvancedmode;
@property(nonatomic, copy) NSString *myAreaset;
@property(nonatomic, retain) NSArray *myAreaarray;

Когда я запускаю свое приложение в симуляторе с запущенными инструментами, я получаю утечку памяти всякий раз, когда прокручиваю список строк (как построено [self myAreaarray]) и отпускаю палец. Странно то, что в тот момент он больше ничего не делал. Основной вид загружен, но было бы странно, что это вызвало бы утечку памяти при прокрутке списка.

Утечки в инструментах следующие:

_NSCFType 48 байтов CoreGraphics CGTypeCreateInstanceWithAllocator

UIDeviceWhiteColor 16 байтов UIKit + [UIColor allocWithZone:]

Когда я снова прокручиваю список, появляется больше таких ошибок. Похоже, что я что-то выделяю, а не выпускаю (пока прокручиваю список?), Но на данный момент не могу найти это.

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 20 мая 2011

Я тоже это вижу, даже абстрагируясь от всего кода вашего приложения:

 UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@"Test" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

 for (int i = 0; i < 100; i++) {
     [as addButtonWithTitle:[NSString stringWithFormat:@"Button %i", i]];
 }
 as.cancelButtonIndex = 99;
 as.destructiveButtonIndex = 0;

 [as showInView:self.view];
 [as release];

При запуске через профилировщик утечек памяти Instruments на каждом экране таблицы действий отображаются 6 утечек UIDeviceWhiteColor и 4 утечки CGColor. Похоже, это ошибка в UIKit.

...