这适用于我的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;
答案 0 :(得分:3)
这不是iCarousel
问题。您在代码中使用release
,autorelease
等语句。去掉它。在ARC中,您无需手动执行内存管理。这就是ARC在那里的原因。
<强>更新强>
根据您的评论,您在为多个转盘显示图像时遇到问题。
我假设你使用两个iCarousel对象。我们可以将它们命名为carousel1
和carousel2
。
此外,您似乎使用沙箱来保存图像。如果是这种情况,则必须使用NSFileManager
从沙箱中获取图像。你需要继续看看如何做到这一点,但在这种情况下,iCarousel的代码将或多或少保持相同。在这里,为简单起见,我假设您只是使用应用程序包,我们有两个NSString
数组,它们引用每个图像:imageArray1
和imageArray2
。
在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
标志。
或者您可以删除所有发布消息。