2013-08-28 2 views
-2

Это для моего iCarouselViewController.mПолучение ошибок с использованием iCarousel

- (void)dealloc 
    { 
     //it's a good idea to set these to nil here to avoid 
     //sending messages to a deallocated viewcontroller 
     carousel1.delegate = nil; 
     carousel1.dataSource = nil; 
     carousel2.delegate = nil; 
     carousel2.dataSource = nil; 

     [carousel1 release]; 
     [carousel2 release]; 
     [items1 release]; 
     [items2 release]; 
     [super dealloc]; 
    } 

Я получаю сообщение об ошибке говорящее

«релиз» недоступен: не доступен в автоматическом режиме счета ссылка
ARC запрещает явное сообщение «освобождение»
«релиз» недоступен: не доступен в автоматическом режиме режим подсчета
ARC forbid с явным сообщение о «выпуска»
«выпуска» недоступно: не доступно в автоматическом справочнике режиме счета
АРК запрещает явное сообщение отправить из «выпуска»
«выпуск» недоступен: не доступен в автоматической ссылке режим подсчета
ARC запрещает явное сообщение посыла 'выпуска'
ARC запрещает явное сообщение посыла 'dealloc'

и ошибок в этом коде Aswell

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 
{ 
    UILabel *label = nil; 

    //create new view if no view is available for recycling 
    if (view == nil) 
    { 
     view = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)] autorelease]; 
     ((UIImageView *)view).image = [UIImage imageNamed:@"page.png"]; 
     view.contentMode = UIViewContentModeCenter; 
     label = [[[UILabel alloc] initWithFrame:view.bounds] autorelease]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textAlignment = UITextAlignmentCenter; 
     label.font = [label.font fontWithSize:50]; 
     [view addSubview:label]; 
    } 
    else 
    { 
     label = [[view subviews] lastObject]; 
    } 

говоря

'autorelease' недоступен: не доступен в автоматическом справочнике режиме счета
ARC запрещает явное сообщение посыла 'autorelease'
'autorelease' недоступен: не доступен в автоматической режим подсчета ссылок
ARC запрещает явное сообщение отправить «автореферат»

Как удалить эту ошибку.
Обновление
Благодарим за ответ. У меня только 4 ошибки, говорящих об использовании незаявленного идентификатора imageArray1. и я знаю, что это происходит. Я просто не понимаю: «Я предполагаю, что вы просто используете пакет приложений, и у нас есть два массива NSString, которые относятся к каждому изображению: imageArray1 и imageArray2». Ниже приведен один из моих кодов сохранения и создание каталога для одного из моих каталогов. Примечание. У меня есть только один NSMutableArray, называемый allImagesArray, который я объявил в файле заголовка.

NSArray *directoryNames = [NSArray arrayWithObjects:@"Apple",nil]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder 

    for (int i = 0; i < [directoryNames count] ; i++) { 
     NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:[directoryNames objectAtIndex:i]]; 
     if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) 
      [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; //Create folder 

     NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"Tops"];   NSData *imageData = UIImagePNGRepresentation(captureImage.image); 
     time_t unixtime = (time_t)[[NSDate date]timeIntervalSince1970]; 
     NSString *timestamp = [NSString stringWithFormat:@"%ldTopsImage.PNG",unixtime]; 
     NSString *filePath = [folderPath stringByAppendingPathComponent:timestamp]; 
     [imageData writeToFile:filePath atomically:YES]; 
    } 
} 

Update 4
это?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //configure carousel 


    imageArray1 = [[NSMutableArray alloc] init]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *[email protected]"apple"; 
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location]; 

    NSArray * directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath]; 
    imageArray1 = directoryContent; 

    imageArray2 = [[NSMutableArray alloc] init]; 
    NSString *[email protected]"green"; 
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location]; 
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath]; 
    imageArray2 = directoryContent; 
+0

Вы сохраняете изображения в песочнице. Извлеките каждый путь изображения (который будет в NSString) и создайте imageArray1 с этими строками, чтобы загружать изображения в карусель1 и соответственно создавать imageArray2. См. Мое редактирование, чтобы понять, как загрузить эти изображения с путей извлечения и показать в iCarousel. –

+0

Извините, я смешиваю изображение imageArray1 и imageArray2. В моем случае я не думаю, что у меня есть массивы. – Radical

+0

См. Я создал два массива, из которых вы упомянули две карусели. Теперь, как бы вы загрузили изображения в две карусели из одного массива? если вы хотите использовать единый массив, вы должны сказать, что в массиве первые десять изображений предназначены для Carousel1, а все остальные изображения для Carousel2.Это не кажется мне практичным. Поэтому я создал два массива. Изучаем, как создать эти два массива из путей изображения. Как я уже сказал, вам нужно научиться и понять NSFileManager для этого случая. Это не сложно, вам просто нужно продолжать толкать, продолжать учиться. –

ответ

3

Это не вопрос iCarousel. Вы используете в своем коде утверждения, такие как release, autorelease. Убери это. В ARC вам не нужно вручную управлять памятью. Вот почему существует ARC.

UPDATE:
В соответствии с вашими комментариями, вы столкнулись с проблемами при отображении изображений для Mutiple каруселей. Я предполагаю, что вы используете два объекта iCarousel.давайте назовите их carousel1 и carousel2. Кроме того, кажется, вы используете песочницу для сохранения изображений. Если это так, то вам нужно получить изображения из песочницы, используя NSFileManager. Вы должны продолжать смотреть, как это сделать, но код для iCarousel будет оставаться более или менее одинаковым в этом случае. Здесь для простоты я предполагаю, что вы просто используете пакет приложений, и у нас есть два массива NSString, которые относятся к каждому изображению: imageArray1 и imageArray2.

В viewDidLoad установите delegate и DataSource объектов каждой карусели, как self

carousel1.delegate = self; 
    carousel1.dataSource = self; 
    carousel2.delegate = self 
    carousel2.dataSource = self; 

Реализовать методы DataSource соответственно:

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel 
{ 
    //return the total number of items in the carousel 
    if (carousel == carousel1) 
    { 
     return [imageArray1 count]; 
    } 
    else 
    { 
     return [imageArray2 count]; 
    } 
} 

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 
{ 
    UILabel *label = nil; 

    //create new view if no view is available for recycling 
    if (view == nil) 
    { 
     view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)]; 

     UIImage *image; 
    if (carousel == carousel1) 
    { 
     image = [UIImage imageWithContentsOfFile:[imageArray1 objectAtIndex:index]]; 
     ((UIImageView *)view).image = image; 
    } 
    else 
    { 
     image = [UIImage imageWithContentsOfFile:[imageArray2 objectAtIndex:index]]; 
     ((UIImageView *)view).image = image; 
    } 
    } 

    return view; 
} 
+1

Очень просто, вам просто нужно не отправлять сообщения, о которых предупреждает компилятор. –

+0

Конечно, проблема может быть решена с использованием флага компилятора, чтобы сообщить компилятору, что этот файл не использует ARC. Но, на мой взгляд, если вы используете ARC в некоторых файлах и не ARC в некоторых файлах, то это более запутанно и сложнее поддерживать код. Мы должны следовать только одному подходу. Если проблема возникла из-за библиотеки, скомпилированной в NON-ARC, было бы разумно использовать флаг компилятора, но здесь проблема только в том, что OP использует код с release/autorelease. –

+0

Спасибо, все было очищено, но я не могу найти место, где вы импортируете изображения в карусель, так как я буду импортировать из своего каталога приложений и отображать на две карусели. – Radical

0

Ну это на самом деле очень просто, вы галочкой «Use Automatic Reference Counting "(ARC) при создании вашего проекта XCode. Чтобы решить это, просто перейдите к своей цели, (предположим, что iCarousel) и сделайте это «buldsettings» ---> object-c automaticrefcount: NO

Затем компилятор должен работать. То, что делает ARC, - это делать это автоматически для вас, поэтому вам не нужно писать отчеты о выпуске и выпуске авто, но если вам это нужно, сделайте то, что я предложил. В противном случае удалите эти заявления о выпуске и autorelease.

0

Это потому, что вы используете ARC в своем проекте, а код, показанный здесь, отсутствует. Чтобы отключить его в этих классах, добавьте -fno-objc-arc. Вы можете сделать это, перейдя на вкладку «Сборка фаз». В группе источников компиляции дважды щелкните файл (класс) и добавьте флаг -fno-objc-arc.

Или вы можете просто удалить все сообщения о выпуске.

+1

Кто говорит, что iCarousel нет? Я использую его версию 1.7.6 и поддерживает ARC. –

+1

О, извините. Правильно. Я отредактирую свой ответ. – Mikael

Смежные вопросы