2011-09-14 3 views
14

Sto provando a passare il puntatore al puntatore a un metodo, ma a quanto pare ARC ha alcuni problemi con il modo in cui lo sto facendo. Qui i due metodi:Numero di riferimento automatico: passaggio dell'indirizzo non locale al parametro __autoreleasing per la ripresa

+ (NSString *)personPropertyNameForIndex:(kSHLPersonDetailsTableRowIndex)index 
{ 
    static NSArray *propertyNames = nil; 

    (nil == propertyNames) ? 
     [self SHL_initPersonPropertyNamesWithArray:&propertyNames] : NULL; 
} 

+ (void)SHL_initPersonPropertyNamesWithArray:(NSArray **)theArray 
{ 
    *theArray = [[NSArray alloc] 
       initWithObjects:@"name", @"email", @"birthdate", @"phone", nil]; 
} 

ricevo il seguente errore:

Automatic Reference Counting Issue: Passing address of non-local object to __autoreleasing parameter for write-back

Sulla linea che appare il seguente comando:

[self SHL_initPersonPropertyNamesWithArray:&propertyNames] : NULL; 
+0

Scegli questa [https://stackoverflow.com/questions/8814718/handling-pointer-to-pointer-ownership-issues-in-arc?answertab=active#tab-top] così, questo chiarirà la maggior parte di dubita – tharinduNA

risposta

26

Il qualificatore stoccaggio __strong è necessario per questo caso .

+ (void)SHL_initPersonPropertyNamesWithArray:(NSArray * __strong *)theArray 

Tuttavia, questo codice non segue lo Basic Memory Management Rules.

You own any object you create

You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, alloc, newObject, or mutableCopy).

Per quale motivo vuoi farlo?

+0

Beh, invece di usare un IF condizionale ogni volta che viene chiamato questo metodo, io uso un'operazione ternaria seguita da una funzione di inizializzazione, ma forse è meglio che rimarrò con ciò che è familiare nel mondo Objective-C piuttosto che in C. – Rami