使ARC文件与ARC文件兼容

问题描述:

为了使旧文件能够在ARC下编译,在开发阶段设置开关-fno-objc-arc 。使ARC文件与ARC文件兼容

但是只有.m文件列出了我可以添加-fno-objc-arc。

但我有一些导致ARC错误的.h文件。我需要将该开关设置为这些.h文件。但我在Build阶段看不到它们。

那么,如何设置.h文件的开关?

这里是导致该问题的.h文件中

\ 
__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; 
} 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)); 
    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)); 
    // 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)); 
      NSCAssert(arr->arr!=NULL,@"could not reallocate the memory"); 
    } 
} 

(ID *)的样品。

+0

如果.m具有-fno-objc-arc标志,则不应在.h文件中出现ARC错误。 – Raspu

+0

有一些.h文件没有对应的.m文件。 –

+0

即使它们没有名称匹配的.m文件,我也希望它们需要#include /#导入到真正的源文件中以成为编译的一部分。没有? –

您可以将.h文件分割成一对.h/.m文件对吗?这样,您可以将方法体放在.m文件中,编译为-fno-objc-arc,并随意包含.h文件。