Как память о тех объектах была освобождена, что не было выделено? - PullRequest
0 голосов
/ 23 апреля 2011

Я инициализировал изображение, например:

    NSString *url=[NSString stringWithFormat:@"url/%@",[self.urlOfImagesToDownload objectAtIndex:i]];
    UIImage *myImage=[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: url]]];
    NSLog(@"%d byte of data", [[NSData dataWithContentsOfURL: [NSURL URLWithString: url]] length]); 

    if (myImage)
    {
        NSString *jpegFilePath = [NSString stringWithFormat:@"%@/%@.jpg",[self pathForDocumentDirectory],[self.idOfImagesToDownload objectAtIndex:i]];
        NSData *data1 = [NSData dataWithData:UIImageJPEGRepresentation(myImage, 1.0f)];//1.0f = 100% quality
        [data1 writeToFile:jpegFilePath atomically:YES];
    }

Теперь, как мне освободить память NSString *jpegFilePath и NSData *data1

А если у меня есть метод:

    -(void) changeImageSlide{
     totalNoOfImages=[copyOf_myGlobleArrayOfImageIds count];
        if (imageCounter>=totalNoOfImages-1) {
            imageCounter=0;
        }
        NSString *str = [NSString stringWithFormat:@"%@.jpg",[copyOf_myGlobleArrayOfImageIds objectAtIndex:imageCounter]];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *fullImgNm=[documentsDirectory stringByAppendingPathComponent:[NSString stringWithString:str]];
        //=(3*imageCounter+4)%25;
UIImage *img=[UIImage imageWithContentsOfFile:fullImgNm];
        [mainSlideShowImageView setImage:img];
        [mainSlideShowImageView setTag:[[copyOf_myGlobleArrayOfImageIds objectAtIndex:imageCounter] intValue]];     
        imageCounter++;

    }

Он был вызван с Timer (для реализации слайд-шоу), как я могу высвободить память здесь из UIImage *img и NSString *FullImageName.

Наряду с этим, как быть уверенным, что после загрузки другого изображения в imageView предыдущее изображение будет освобождено из памяти?

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

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

но ...

В первом методе вы попадете на

UIImage *myImage=[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: url]]];

потому что там вы инициируете объект и таким образом вступаете во владение. Вы должны выпустить это в конце метода

0 голосов
/ 23 апреля 2011

Каждый из объектов, о которых вы спрашиваете, не требует явного освобождения их, поскольку они автоматически высвобождаются. Вы можете сказать, что они являются автоматически выпущенными объектами, потому что методы, с помощью которых вы устанавливаете объекты, не начинаются с «alloc», «new», «copy» или «mutableCopy». Вы также не сохранили ни одного из них.

Я рекомендую вам прочитать Руководство по программированию управления памятью. Это поможет вам понять, как управлять памятью при разработке для iOS.

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...