-2

这是给我的iCarouselViewController.m

- (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];
    }

我收到一条错误消息

'release' 不可用:在自动引用计数模式下不可用
ARC 禁止显式消息发送'release'
'release' 不可用:在自动引用计数模式下不可用
ARC 禁止显式消息发送'release'
'release' 不可用:在自动引用计数模式下不可用
ARC 禁止显式发送“release”消息
“release”不可用:在自动引用计数模式下不可用
ARC 禁止显式发送“release”
消息 ARC 禁止显式发送“dealloc”消息

以及此代码中的错误

- (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 禁止显式消息发送'autorelease'

我怎样才能清除这个错误。
更新
感谢您的回答我只有 4 个错误说使用未声明的标识符 imageArray1。我知道这正在发生。我只是不明白“我假设你只是在使用应用程序的包,我们有两个 NSString 数组,它们引用每个图像:imageArray1 和 imageArray2。” 下面是我的保存代码之一,并为我的一个目录创建目录。注意:我只有一个名为 allImagesArray 的 NSMutableArray,我在头文件中声明了它。

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];
    }
}

更新 4
这是?

- (void)viewDidLoad
{
    [super viewDidLoad];

    //configure carousel


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

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

    imageArray2 = [[NSMutableArray alloc] init];
    NSString *location=@"green";
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location];
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
    imageArray2 = directoryContent;
4

3 回答 3

3

这不是iCarousel问题。release您在代码中使用,之类的语句autorelease。去掉它。在 ARC 中,您不需要手动进行内存管理。这就是ARC存在的原因。

更新:
根据您的评论,您在为多个轮播显示图像时遇到了问题。我假设您正在使用两个 iCarousel 对象。让他们命名carousel1carousel2。此外,您似乎正在使用沙箱来保存图像。如果是这种情况,那么您必须使用NSFileManager. 您需要继续研究如何做到这一点,但 iCarousel 的代码在这种情况下也将或多或少保持相同。在这里,为简单起见,我假设您只是使用应用程序的捆绑包,我们有两个数组,NSString其中引用每个图像:imageArray1imageArray2.

viewDidLoad中,将delegate每个轮播的数据源对象设置为self

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

相应地实现数据源方法:

- (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;
}
于 2013-08-28T11:18:02.953 回答
0

那是因为您在项目中使用了 ARC,而您在此处显示的代码却没有。要在这些类中禁用它,请添加-fno-objc-arc. 您可以通过进入目标构建阶段选项卡来执行此操作。在编译源组中,双击文件(类)并添加-fno-objc-arc标志。

或者您可以删除所有发布消息。

于 2013-08-28T11:20:13.850 回答
0

嗯,这实际上非常简单,您在创建 XCode 项目时勾选了“使用自动引用计数”(ARC) 框。要解决它,只需转到您的目标(我假设为 iCarousel)并执行此“buldsettings”---> objective-c automaticrefcount :NO

然后编译器应该可以工作。ARC 所做的是自动为您完成这些工作,因此您不必编写自动发布和发布声明,但如果您需要它们,请按照我的建议进行操作。否则删除这些 release 和 autorelease 语句。

于 2013-08-28T11:18:07.123 回答