更新到ARC错误 [英] updating to ARC errors

查看:647
本文介绍了更新到ARC错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将项目更新到ARC。虽然我看到了一些关于更新到ARC的帖子,但我看到的帖子都没有处理这个具体问题。我有多个错误,大多数说:

  ARC发行
指向非const类型'id'没有明确的所有权

指向行



<$ p在CCMenu.m类中的$ p> CCARRAY_FOREACH(children_,item)



。请帮助。



更新:



重新启动Xcode后,较长的发现位置

  CCARRAY_FOREACH(children_,item)

,但是在ccCArray.h类中发现了我评论为

的行:

  // Arc Issue 


警告标志:

  Arc Issue 
此_builtin__memmove_chk调用的目标是指向所有者在代码中调用memmove的任何地方都会显示-qualified-type'autoreleasing-id'

另一个错误:

  ARC铸造规则
C的隐式转换指针类型void *到Objective-C指针类型id需要一个桥接转型

我注释为:

  // ARC Casting Rules 
pre>

ccCArray.h:

  #ifndef CC_ARRAY_H 
#define CC_ARRAY_H

#import< Foundation / Foundation.h>

#import< stdlib.h>
#import< string.h>


#pragma mark -
#pragma mark ccArray for Objects

//轻松集成
#define CCARRAYDATA_FOREACH(__ array__,__object__) \
__object __ = __ array __-> arr [0]; for(NSUInteger i = 0,num = __ array __-> num; i num; i ++,__object __ = __ array __-> arr [i])\


typedef struct ccArray {
NSUInteger num,max;
id * arr; // Arc Issue
} ccArray;

/ **分配和初始化具有指定容量的新数组* /
static inline ccArray * ccArrayNew(NSUInteger capacity){
if(capacity == 0)
容量= 1;

ccArray * arr =(ccArray *)malloc(sizeof(ccArray)); // Arc Issue
arr-> num = 0;
arr-> arr =(id *)malloc(capacity * sizeof(id));
arr-> max = capacity;

return arr;
}

static inline void ccArrayRemoveAllObjects(ccArray * arr);

/ **删除所有剩余的对象后释放数组。静默忽略nil arr。 * /
static inline void ccArrayFree(ccArray * arr)
{
if(arr == nil)return;

ccArrayRemoveAllObjects(arr);

free(arr-> arr);
free(arr);
}

/ **双倍数组容量* /
static inline void ccArrayDoubleCapacity(ccArray * arr)
{
arr-> max * 2;
id * newArr =(id *)realloc(arr-> arr,arr-> max * sizeof(id)); // Arc Issue
//当内存不足时会失败
NSCAssert(newArr!= NULL,@ccArrayDoubleCapacity failed。Not enough memory);
arr-> arr = newArr;
}

/ **增加数组容量,使max> = num + extra。 * /
static inline void ccArrayEnsureExtraCapacity(ccArray * arr,NSUInteger extra)
{
while(arr-> max< arr-&num num + extra)
ccArrayDoubleCapacity arr);
}

/ **缩小数组,使内存占用符合项目数* /
static inline void ccArrayShrink(ccArray * arr)
{
NSUInteger newSize;

//仅在必要时调整大小
if(arr-> max> arr-> num&&!(arr-> num == 0&& arr-> max == 1))
{
if(arr-> num!= 0)
{
newSize = arr-&
arr-> max = arr-> num;
}
else
{//最小容量为1,有0个元素数组将被realloc释放
newSize = 1;
arr-> max = 1;
}

arr-> arr =(id *)realloc(arr-> arr,newSize * sizeof(id)); // Arc Issue
NSCAssert(arr-> arr!= NULL,@无法重新分配内存);
}
}

/ **返回对象第一次出现的索引,NSNotFound如果找不到对象。 * /
static inline NSUInteger ccArrayGetIndexOfObject(ccArray * arr,id object)
{
for(NSUInteger i = 0; i num; i ++)
if (arr-> arr [i] == object)return i;

return NSNotFound;
}

/ **返回一个布尔值,表示对象是否存在于数组中。 * /
static inline BOOL ccArrayContainsObject(ccArray * arr,id object)
{
return ccArrayGetIndexOfObject(arr,object)!= NSNotFound;
}

/ **追加一个对象。如果数组没有足够的容量,Bahaviour未定义。 * /
static inline void ccArrayAppendObject(ccArray * arr,id object)
{
arr-> arr [arr-# num] = [object retain];
arr-> num ++;
}

/ **追加一个对象。如果需要,arr的容量增加。 * /
static inline void ccArrayAppendObjectWithResize(ccArray * arr,id object)
{
ccArrayEnsureExtraCapacity(arr,1);
ccArrayAppendObject(arr,object);
}

/ **将对象从plusArr附加到arr。如果arr没有
足够的容量,行为未定义。 * /
static inline void ccArrayAppendArray(ccArray * arr,ccArray * plusArr)
{
for(NSUInteger i = 0; i< plusArr-> num; i ++)
ccArrayAppendObject(arr,plusArr-> arr [i]);
}

/ **将对象从plusArr附加到arr。如果需要,arr的容量增加。 * /
static inline void ccArrayAppendArrayWithResize(ccArray * arr,ccArray * plusArr)
{
ccArrayEnsureExtraCapacity(arr,plusArr- num);
ccArrayAppendArray(arr,plusArr);
}

/ **在索引处插入一个对象* /
static inline void ccArrayInsertObjectAtIndex(ccArray * arr,id对象,NSUInteger索引)
{
NSCAssert(index< = arr-" num,@Invalid index。Out of bounds);

ccArrayEnsureExtraCapacity(arr,1);

NSUInteger remaining = arr-> num-index;
if(remaining> 0)
memmove(& arr-> arr [index + 1],& arr-> arr [index],sizeof(id)* remaining);

arr-> arr [index] = [object retain];
arr-> num ++;
}

/ **交换两个对象* /
static inline void ccArraySwapObjectsAtIndexes(ccArray * arr,NSUInteger index1,NSUInteger index2)
{
NSCAssert (index1< arr- num,@(1)无效索引。超出范围);
NSCAssert(index2< arr-" num,@(2)无效的索引超出范围);

id object1 = arr-> arr [index1];

arr-> arr [index1] = arr-> arr [index2];
arr-> arr [index2] = object1;
}

/ **从arr中删除所有对象* /
static inline void ccArrayRemoveAllObjects(ccArray * arr)
{
while(arr-> ; num> 0)
[arr-> arr [ - arr- num] release];
}

/ **删除指定索引处的对象,并推回所有后续对象。
如果索引在[0,num-1]之外,行为未定义。 * /
static inline void ccArrayRemoveObjectAtIndex(ccArray * arr,NSUInteger index)
{
[arr-> arr [index] release];
arr-> num--;

NSUInteger remaining = arr-> num-index;
if(remaining> 0)
memmove(& arr-> arr [index],& arr-> arr [index + 1],remaining * sizeof(id));
}

/ **删除指定索引处的对象,并用最后一个对象
填充间隙,从而避免需要推回后续对象。
如果索引在[0,num-1]之外,行为未定义。 * /
static inline void ccArrayFastRemoveObjectAtIndex(ccArray * arr,NSUInteger index)
{
[arr-> arr [index] release];
NSUInteger last = --arr-> num;
arr-> arr [index] = arr-> arr [last];
}

static inline void ccArrayFastRemoveObject(ccArray * arr,id object)
{
NSUInteger index = ccArrayGetIndexOfObject(arr,object);
if(index!= NSNotFound)
ccArrayFastRemoveObjectAtIndex(arr,index);
}

/ **搜索对象的第一次出现并删除它。如果对象不是
,则该函数没有效果。 * /
static inline void ccArrayRemoveObject(ccArray * arr,id object)
{
NSUInteger index = ccArrayGetIndexOfObject(arr,object);
if(index!= NSNotFound)
ccArrayRemoveObjectAtIndex(arr,index);
}

/ **从arr中删除minusArr中的所有对象。对于minusArr中的每个对象,将删除arr中的
第一个匹配实例。 * /
static inline void ccArrayRemoveArray(ccArray * arr,ccArray * minusArr)
{
for(NSUInteger i = 0; i num; i ++)
ccArrayRemoveObject(arr,minusArr-> arr [i]);
}

/ **从arr中删除minusArr中的所有对象。对于minusArr中的每个对象,将删除与arr中的所有匹配实例的
。 * /
static inline void ccArrayFullRemoveArray(ccArray * arr,ccArray * minusArr)
{
NSUInteger back = 0;

for(NSUInteger i = 0; i num; i ++){
if(ccArrayContainsObject(minusArr,arr-> arr [i])){
[arr-> arr [i] release];
back ++;
} else
arr-> arr [i-back] = arr-> arr [i]
}

arr-> num - = back;
}

/ **向arr中的每个对象发送由给定选择器标识的消息。 * /
static inline void ccArrayMakeObjectsPerformSelector(ccArray * arr,SEL sel)
{
for(NSUInteger i = 0; i num; i ++)
arr-> arr [i] performSelector:sel];
}

static inline void ccArrayMakeObjectsPerformSelectorWithObject(ccArray * arr,SEL sel,id object)
{
for(NSUInteger i = 0; i [arr-> arr [i] performSelector:sel withObject:object];
}


#pragma mark -
#pragma mark ccCArray for values(c structures)

typedef ccArray ccCArray;

static inline void ccCArrayRemoveAllValues(ccCArray * arr);

/ **分配和初始化具有指定容量的新C数组* /
static inline ccCArray * ccCArrayNew(NSUInteger capacity){
if(capacity == 0)
capacity = 1;

ccCArray * arr =(ccCArray *)malloc(sizeof(ccCArray));
arr-> num = 0;
arr-> arr =(id *)malloc(capacity * sizeof(id)); // Arc Issue
arr-> max = capacity;

return arr;
}

/ **删除所有剩余值后释放C数组。静默忽略nil arr。 * /
static inline void ccCArrayFree(ccCArray * arr)
{
if(arr == nil)return;

ccCArrayRemoveAllValues(arr);

free(arr-> arr);
free(arr);
}

/ **双重C阵列容量* /
static inline void ccCArrayDoubleCapacity(ccCArray * arr)
{
ccArrayDoubleCapacity(arr);
}

/ **增加数组容量,使max> = num + extra。 * /
static inline void ccCArrayEnsureExtraCapacity(ccCArray * arr,NSUInteger extra)
{
ccArrayEnsureExtraCapacity(arr,extra);
}

/ **返回值的第一次出现的索引,NSNotFound如果未找到值。 * /
static inline NSUInteger ccCArrayGetIndexOfValue(ccCArray * arr,void * value)
{
for(NSUInteger i = 0; i num; i ++)
if(arr-> arr [i] == value)return i;
return NSNotFound;
}

/ **返回一个布尔值,指示值是否存在于C数组中。 * /
static inline BOOL ccCArrayContainsValue(ccCArray * arr,void * value)
{
return ccCArrayGetIndexOfValue(arr,value)!= NSNotFound;
}

/ **在某个位置插入一个值。如果aray没有足够的容量,行为未定义* /
static inline void ccCArrayInsertValueAtIndex(ccCArray * arr,void * value,NSUInteger index)
{
NSCAssert(index< arr-> max,@ccCArrayInsertValueAtIndex:invalid index);

NSUInteger remaining = arr-> num-index;

//最后一个值不需要移动
if(remaining> 0){
// tex coordinates
memmove(& arr-> ; arr [index + 1],& arr-> arr [index],sizeof(void *)* remaining);
}

arr-> num ++;
arr-> arr [index] =(id)value;
}

/ **追加一个值。如果数组没有足够的容量,Bahaviour未定义。 * /
static inline void ccCArrayAppendValue(ccCArray * arr,void * value)
{
arr-> arr [arr-&num num] =
arr-> num ++;
}

/ **追加一个值。如果需要,arr的容量增加。 * /
static inline void ccCArrayAppendValueWithResize(ccCArray * arr,void * value)
{
ccCArrayEnsureExtraCapacity(arr,1);
ccCArrayAppendValue(arr,value);
}

/ **将值从plusArr附加到arr。如果arr没有
足够的容量,行为未定义。 * /
static inline void ccCArrayAppendArray(ccCArray * arr,ccCArray * plusArr)
{
(NSUInteger i = 0; i< plusArr- num; i ++)
ccCArrayAppendValue(arr,plusArr-> arr [i]); // ARC Casting Rules
}

/ **将值从plusArr附加到arr。如果需要,arr的容量增加。 * /
static inline void ccCArrayAppendArrayWithResize(ccCArray * arr,ccCArray * plusArr)
{
ccCArrayEnsureExtraCapacity(arr,plusArr- num);
ccCArrayAppendArray(arr,plusArr);
}

/ **从arr中删除所有值* /
static inline void ccCArrayRemoveAllValues(ccCArray * arr)
{
arr-& = 0;
}

/ **删除指定索引处的值,并推回所有后续值。
如果索引在[0,num-1]之外,行为未定义。
@since v0.99.4
* /
static inline void ccCArrayRemoveValueAtIndex(ccCArray * arr,NSUInteger index)
{
(NSUInteger last = --arr-> ; num; index< last; index ++)
arr-> arr [index] = arr-> arr [index + 1];
}

/ **删除指定索引处的值,并用最后一个值
填充该间隙,从而避免需要推回后续值。
如果索引在[0,num-1]之外,行为未定义。
@since v0.99.4
* /
static inline void ccCArrayFastRemoveValueAtIndex(ccCArray * arr,NSUInteger index)
{
NSUInteger last = --arr-& ;
arr-> arr [index] = arr-> arr [last];
}

/ **搜索第一次出现的值并删除它。如果未找到值,则函数不起作用。
@since v0.99.4
* /
static inline void ccCArrayRemoveValue(ccCArray * arr,void * value)
{
NSUInteger index = ccCArrayGetIndexOfValue(arr,value) ;
if(index!= NSNotFound)
ccCArrayRemoveValueAtIndex(arr,index);
}

/ **从arr中删除minusArr中的所有值。对于minusArr中的每个值,将删除arr中的第一个匹配实例。
@since v0.99.4
* /
static inline void ccCArrayRemoveArray(ccCArray * arr,ccCArray * minusArr)
{
for(NSUInteger i = 0; i< ; minusArr-> num; i ++)
ccCArrayRemoveValue(arr,minusArr-> arr [i]); // ARC Cast规则
}

/ **从arr中删除minusArr中的所有值。对于minusArr中的每个值,将删除arr中的所有匹配实例。
@since v0.99.4
* /
static inline void ccCArrayFullRemoveArray(ccCArray * arr,ccCArray * minusArr)
{
NSUInteger back = 0;

for(NSUInteger i = 0; i num; i ++){
if(ccCArrayContainsValue(minusArr,arr-> arr [i]))投放规则{
back ++;
} else
arr-> arr [i-back] = arr-> arr [i]
}

arr-> num - = back;
}
#endif // CC_ARRAY_H


解决方案

您似乎使用的是与ARC不兼容的cocos2d版本,因为ccArray代码缺少ARC修补程序和附加项。 升级到cocos2d 1.1或更高版本。 Cocos2d 1.0.1也可能工作,但我认为版本仍然有一些ARC问题。



开始一个新的,启用ARC的cocos2d项目,然后重新添加您的代码和资源


I am trying to update a project to ARC. Though I've seen a few posts on updating to ARC, none of the posts I've seen handle this specific issue. I've got multiple errors, most saying:

ARC Issue
Pointer to non-const type 'id' with no explicit ownership

pointing to line

CCARRAY_FOREACH(children_, item)

in the CCMenu.m class. Please help.

Updated:

After restarting Xcode the above issue is no longer found at

CCARRAY_FOREACH(children_, item)

but was found in the ccCArray.h class at the lines I've commented as

// Arc Issue

Several other errors have surface. The warning sign:

Arc Issue
Destination for this '_builtin__memmove_chk' call is a pointer to ownership-qualified-type 'autoreleasing-id'

appears wherever is memmove called in the code.

another error:

ARC Casting Rules
Implicit conversion of C pointer type 'void *' to Objective-C pointer type 'id' requires a bridged cast

appears at the lines I've commented as:

//ARC Casting Rules 

ccCArray.h:

#ifndef CC_ARRAY_H
#define CC_ARRAY_H

#import <Foundation/Foundation.h>

#import <stdlib.h>
#import <string.h>


#pragma mark -
#pragma mark ccArray for Objects

// Easy integration 
#define CCARRAYDATA_FOREACH(__array__, __object__)                                                          \
__object__=__array__->arr[0]; for(NSUInteger i=0, num=__array__->num; i<num; i++,   __object__=__array__->arr[i])   \


typedef struct ccArray {
NSUInteger num, max;
id *arr;   // Arc Issue
} ccArray;

/** Allocates and initializes a new array with specified capacity */
static inline ccArray* ccArrayNew(NSUInteger capacity) {
if (capacity == 0)
    capacity = 1; 

ccArray *arr = (ccArray*)malloc( sizeof(ccArray) );    // Arc Issue
arr->num = 0;
arr->arr =  (id*) malloc( capacity * sizeof(id) );
arr->max = capacity;

return arr;
}

static inline void ccArrayRemoveAllObjects(ccArray *arr);

/** Frees array after removing all remaining objects. Silently ignores nil arr. */
static inline void ccArrayFree(ccArray *arr)
{
if( arr == nil ) return;

ccArrayRemoveAllObjects(arr);

free(arr->arr);
free(arr);
}

/** Doubles array capacity */
static inline void ccArrayDoubleCapacity(ccArray *arr)
{
arr->max *= 2;
id *newArr = (id *)realloc( arr->arr, arr->max * sizeof(id) );    // Arc Issue
// will fail when there's not enough memory
NSCAssert(newArr != NULL, @"ccArrayDoubleCapacity failed. Not enough memory");
arr->arr = newArr;
}

/** Increases array capacity such that max >= num + extra. */
static inline void ccArrayEnsureExtraCapacity(ccArray *arr, NSUInteger extra)
{
while (arr->max < arr->num + extra)
    ccArrayDoubleCapacity(arr);
}

/** shrinks the array so the memory footprint corresponds with the number of items */
static inline void ccArrayShrink(ccArray *arr)
{
    NSUInteger newSize;

 //only resize when necessary
if (arr->max > arr->num && !(arr->num==0 && arr->max==1))
{
    if (arr->num!=0) 
    {
        newSize=arr->num;
        arr->max=arr->num; 
    }
    else 
    {//minimum capacity of 1, with 0 elements the array would be free'd by realloc
        newSize=1;
        arr->max=1;
    }

    arr->arr = (id*) realloc(arr->arr,newSize * sizeof(id) );   // Arc Issue
    NSCAssert(arr->arr!=NULL,@"could not reallocate the memory");
}
} 

/** Returns index of first occurence of object, NSNotFound if object not found. */
static inline NSUInteger ccArrayGetIndexOfObject(ccArray *arr, id object)
{
for( NSUInteger i = 0; i < arr->num; i++)
    if( arr->arr[i] == object ) return i;

return NSNotFound;
}

/** Returns a Boolean value that indicates whether object is present in array. */
static inline BOOL ccArrayContainsObject(ccArray *arr, id object)
{
return ccArrayGetIndexOfObject(arr, object) != NSNotFound;
}

/** Appends an object. Bahaviour undefined if array doesn't have enough capacity. */
static inline void ccArrayAppendObject(ccArray *arr, id object)
{
arr->arr[arr->num] = [object retain];
arr->num++;
}

/** Appends an object. Capacity of arr is increased if needed. */
static inline void ccArrayAppendObjectWithResize(ccArray *arr, id object)
{
ccArrayEnsureExtraCapacity(arr, 1);
ccArrayAppendObject(arr, object);
}

/** Appends objects from plusArr to arr. Behaviour undefined if arr doesn't have
enough capacity. */
static inline void ccArrayAppendArray(ccArray *arr, ccArray *plusArr)
{
for( NSUInteger i = 0; i < plusArr->num; i++)
    ccArrayAppendObject(arr, plusArr->arr[i]);
}

/** Appends objects from plusArr to arr. Capacity of arr is increased if needed. */
static inline void ccArrayAppendArrayWithResize(ccArray *arr, ccArray *plusArr)
{
ccArrayEnsureExtraCapacity(arr, plusArr->num);
ccArrayAppendArray(arr, plusArr);
}

/** Inserts an object at index */
static inline void ccArrayInsertObjectAtIndex(ccArray *arr, id object, NSUInteger index)
{
NSCAssert(index<=arr->num, @"Invalid index. Out of bounds");

ccArrayEnsureExtraCapacity(arr, 1);

NSUInteger remaining = arr->num - index;
if( remaining > 0)
    memmove(&arr->arr[index+1], &arr->arr[index], sizeof(id) * remaining );

arr->arr[index] = [object retain];
arr->num++;
}

/** Swaps two objects */
static inline void ccArraySwapObjectsAtIndexes(ccArray *arr, NSUInteger index1, NSUInteger index2)
{
NSCAssert(index1 < arr->num, @"(1) Invalid index. Out of bounds");
NSCAssert(index2 < arr->num, @"(2) Invalid index. Out of bounds");

id object1 = arr->arr[index1];

arr->arr[index1] = arr->arr[index2];
arr->arr[index2] = object1;
}

/** Removes all objects from arr */
static inline void ccArrayRemoveAllObjects(ccArray *arr)
{
while( arr->num > 0 )
    [arr->arr[--arr->num] release]; 
}

/** Removes object at specified index and pushes back all subsequent objects.
Behaviour undefined if index outside [0, num-1]. */
static inline void ccArrayRemoveObjectAtIndex(ccArray *arr, NSUInteger index)
{
[arr->arr[index] release];
arr->num--;

NSUInteger remaining = arr->num - index;
if(remaining>0)
    memmove(&arr->arr[index], &arr->arr[index+1], remaining * sizeof(id));
}

/** Removes object at specified index and fills the gap with the last object,
thereby avoiding the need to push back subsequent objects.
Behaviour undefined if index outside [0, num-1]. */
static inline void ccArrayFastRemoveObjectAtIndex(ccArray *arr, NSUInteger index)
{
[arr->arr[index] release];
NSUInteger last = --arr->num;
arr->arr[index] = arr->arr[last];
}

static inline void ccArrayFastRemoveObject(ccArray *arr, id object)
{
NSUInteger index = ccArrayGetIndexOfObject(arr, object);
if (index != NSNotFound)
    ccArrayFastRemoveObjectAtIndex(arr, index);
}

/** Searches for the first occurance of object and removes it. If object is not
found the function has no effect. */
static inline void ccArrayRemoveObject(ccArray *arr, id object)
{
NSUInteger index = ccArrayGetIndexOfObject(arr, object);
if (index != NSNotFound)
    ccArrayRemoveObjectAtIndex(arr, index);
}

/** Removes from arr all objects in minusArr. For each object in minusArr, the
first matching instance in arr will be removed. */
static inline void ccArrayRemoveArray(ccArray *arr, ccArray *minusArr)
{
for( NSUInteger i = 0; i < minusArr->num; i++)
    ccArrayRemoveObject(arr, minusArr->arr[i]);
}

/** Removes from arr all objects in minusArr. For each object in minusArr, all
matching instances in arr will be removed. */
static inline void ccArrayFullRemoveArray(ccArray *arr, ccArray *minusArr)
{
NSUInteger back = 0;

for( NSUInteger i = 0; i < arr->num; i++) {
    if( ccArrayContainsObject(minusArr, arr->arr[i]) ) {
        [arr->arr[i] release];
        back++;
    } else
        arr->arr[i - back] = arr->arr[i];
}

arr->num -= back;
}

/** Sends to each object in arr the message identified by given selector. */
static inline void ccArrayMakeObjectsPerformSelector(ccArray *arr, SEL sel)
{
for( NSUInteger i = 0; i < arr->num; i++)
    [arr->arr[i] performSelector:sel];
}

static inline void ccArrayMakeObjectsPerformSelectorWithObject(ccArray *arr, SEL sel, id object)
{
for( NSUInteger i = 0; i < arr->num; i++)
    [arr->arr[i] performSelector:sel withObject:object];
}


#pragma mark -
#pragma mark ccCArray for Values (c structures)

typedef ccArray ccCArray;

static inline void ccCArrayRemoveAllValues(ccCArray *arr);

/** Allocates and initializes a new C array with specified capacity */
static inline ccCArray* ccCArrayNew(NSUInteger capacity) {
if (capacity == 0)
    capacity = 1; 

ccCArray *arr = (ccCArray*)malloc( sizeof(ccCArray) );   
arr->num = 0;
arr->arr =  (id*) malloc( capacity * sizeof(id) );    // Arc Issue
arr->max = capacity;

return arr;
}

/** Frees C array after removing all remaining values. Silently ignores nil arr. */
static inline void ccCArrayFree(ccCArray *arr)
{
if( arr == nil ) return;

ccCArrayRemoveAllValues(arr);

free(arr->arr);
free(arr);
}

/** Doubles C array capacity */
static inline void ccCArrayDoubleCapacity(ccCArray *arr)
{
ccArrayDoubleCapacity(arr);
}

/** Increases array capacity such that max >= num + extra. */
static inline void ccCArrayEnsureExtraCapacity(ccCArray *arr, NSUInteger extra)
{
ccArrayEnsureExtraCapacity(arr,extra);
}

/** Returns index of first occurence of value, NSNotFound if value not found. */
static inline NSUInteger ccCArrayGetIndexOfValue(ccCArray *arr, void* value)
{
for( NSUInteger i = 0; i < arr->num; i++)
    if( arr->arr[i] == value ) return i;
return NSNotFound;
}

/** Returns a Boolean value that indicates whether value is present in the C array. */
static inline BOOL ccCArrayContainsValue(ccCArray *arr, void* value)
{
return ccCArrayGetIndexOfValue(arr, value) != NSNotFound;
}

/** Inserts a value at a certain position. Behaviour undefined if aray doesn't have enough capacity */
static inline void ccCArrayInsertValueAtIndex( ccCArray *arr, void *value, NSUInteger index)
{
NSCAssert( index < arr->max, @"ccCArrayInsertValueAtIndex: invalid index");

NSUInteger remaining = arr->num - index;

// last Value doesn't need to be moved
if( remaining > 0) {
    // tex coordinates
    memmove( &arr->arr[index+1],&arr->arr[index], sizeof(void*) * remaining );
}

arr->num++; 
arr->arr[index] = (id) value;
}

/** Appends an value. Bahaviour undefined if array doesn't have enough capacity. */
static inline void ccCArrayAppendValue(ccCArray *arr, void* value)
{
arr->arr[arr->num] = (id) value;
arr->num++;
}

/** Appends an value. Capacity of arr is increased if needed. */
static inline void ccCArrayAppendValueWithResize(ccCArray *arr, void* value)
{
ccCArrayEnsureExtraCapacity(arr, 1);
ccCArrayAppendValue(arr, value);
}

/** Appends values from plusArr to arr. Behaviour undefined if arr doesn't have
enough capacity. */
static inline void ccCArrayAppendArray(ccCArray *arr, ccCArray *plusArr)
{
for( NSUInteger i = 0; i < plusArr->num; i++)
    ccCArrayAppendValue(arr, plusArr->arr[i]);   //ARC Casting Rules
}

/** Appends values from plusArr to arr. Capacity of arr is increased if needed. */
static inline void ccCArrayAppendArrayWithResize(ccCArray *arr, ccCArray *plusArr)
{
ccCArrayEnsureExtraCapacity(arr, plusArr->num);
ccCArrayAppendArray(arr, plusArr);
}

/** Removes all values from arr */
static inline void ccCArrayRemoveAllValues(ccCArray *arr)
{
arr->num = 0;
}

/** Removes value at specified index and pushes back all subsequent values.
Behaviour undefined if index outside [0, num-1].
@since v0.99.4
*/
static inline void ccCArrayRemoveValueAtIndex(ccCArray *arr, NSUInteger index)
{   
for( NSUInteger last = --arr->num; index < last; index++)
    arr->arr[index] = arr->arr[index + 1];
}

/** Removes value at specified index and fills the gap with the last value,
 thereby avoiding the need to push back subsequent values.
 Behaviour undefined if index outside [0, num-1].
 @since v0.99.4
 */
static inline void ccCArrayFastRemoveValueAtIndex(ccCArray *arr, NSUInteger index)
{
NSUInteger last = --arr->num;
arr->arr[index] = arr->arr[last];
}

/** Searches for the first occurance of value and removes it. If value is not found the function has no effect.
 @since v0.99.4
 */
static inline void ccCArrayRemoveValue(ccCArray *arr, void* value)
{
NSUInteger index = ccCArrayGetIndexOfValue(arr, value);
if (index != NSNotFound)
    ccCArrayRemoveValueAtIndex(arr, index);
}

/** Removes from arr all values in minusArr. For each Value in minusArr, the first matching instance in arr will be removed.
 @since v0.99.4
 */
static inline void ccCArrayRemoveArray(ccCArray *arr, ccCArray *minusArr)
{
for( NSUInteger i = 0; i < minusArr->num; i++)
    ccCArrayRemoveValue(arr, minusArr->arr[i]);  //ARC Casting Rules
}

/** Removes from arr all values in minusArr. For each value in minusArr, all matching instances in arr will be removed.
 @since v0.99.4
 */
static inline void ccCArrayFullRemoveArray(ccCArray *arr, ccCArray *minusArr)
{
NSUInteger back = 0;

for( NSUInteger i = 0; i < arr->num; i++) {
    if( ccCArrayContainsValue(minusArr, arr->arr[i]) ) //ARC Casting Rules {
        back++;
    } else
        arr->arr[i - back] = arr->arr[i];
}

arr->num -= back;
}
#endif // CC_ARRAY_H

解决方案

It looks like you're using a version of cocos2d that isn't compatible with ARC because the ccArray code is missing the ARC fixes and additions. Upgrade to cocos2d 1.1 or newer. Cocos2d 1.0.1 might work as well but I think that version still has some ARC issues.

Or start with a fresh, ARC-enabled cocos2d project and then re-add your code and resources to it.

这篇关于更新到ARC错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆