使用iCarousel获取错误

时间:2013-08-28 11:11:47

标签: ios objective-c automatic-ref-counting

这适用于我的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'不可用:自动参考不可用   计数模式
ARC禁止发布'释放'的明确消息   'release'不可用:自动参考不可用   计数模式
ARC禁止发布'释放'的明确消息   'release'不可用:自动参考不可用   计数模式
ARC禁止发布'释放'的明确消息   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;

3 个答案:

答案 0 :(得分:3)

这不是iCarousel问题。您在代码中使用releaseautorelease等语句。去掉它。在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;
}

答案 1 :(得分:0)

实际上这很简单,在创建XCode项目时,您已经勾选了“使用自动引用计数”(ARC)框。要解决它只是去你的目标,(我假设iCarousel)并做这个“buldsettings”---&gt; objective -c automaticrefcount:NO

然后编译器应该工作。 ARC做的是自动为你做这些事情,所以你不必编写自动发布和发布语句,但是如果你需要它们就按照我的建议去做。否则,请删除这些版本和自动释放语句。

答案 2 :(得分:0)

那是因为你在项目中使用ARC而你在这里展示的代码却没有。要在这些类中禁用它,请添加-fno-objc-arc。您可以通过进入目标Build Phases选项卡来完成此操作。在“编译源”组中,双击文件(类)并添加-fno-objc-arc标志。

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