2015-06-27 6 views
16

In Xcode 7, sto ottenendo questo avvertimento:Xcode 7, Obj-C, "Null passata a un callee che richiede un argomento non nullo"

Null passed to a callee that requires a non-null argument 

.. da questa inizializzazione di un nil NSMutableArray ...

sectionTitles = [[NSMutableArray alloc] initWithObjects:nil]; 

ho scoperto che dovrei usare removeAllObjects invece.

[sectionTitles removeAllObjects]; 

Tuttavia, questo non mi permette di valutare un sectionTitles.count == 0. Ho provato sectionTitles == nil, tuttavia a meno che non utilizzi iniWithObjects Non riesco a aggiungere oggetti in seguito.

Ho bisogno di impostare la matrice su zero o zero, quando aggiorno la mia origine dati, quando non ci sono record. Non riesco a utilizzare addObject per aggiungere elementi a meno che non abbia utilizzato initWithObjects.

+0

È possibile lavorare solo con un oggetto inizializzato. Chiamare contare su zero potrebbe funzionare, però. – Eiko

+0

'if (sectionTitles.count! = Nil)' provoca un avviso? – Jules

+0

Sia '[sectionTitles removeAllObjects]' o 'sectionTitles = [NSMutableArray array]' dovrebbero funzionare, sono logicamente uguali (anche se le prestazioni potrebbero differire). –

risposta

15

Perché non provi:

sectionTitles = [[NSMutableArray alloc] init]; 

o una qualsiasi delle seguenti:

sectionTitles = [[NSMutableArray alloc] initWithCapacity:sectionTitles.count]; 
sectionTitles = [NSMutableArray new]; 
sectionTitles = [NSMutableArray array]; 
sectionTitles = [NSMutableArray arrayWithCapacity:sectionTitles.count]; 

magari un po 'quelle stupide:

sectionTitles = [NSMutableArray arrayWithArray:@[]]; 
sectionTitles = [@[] mutableCopy]; 

Ci sono molti modi per creare vuoti matrici mutevoli. Basta leggere lo doc.

+0

Sono sorpreso dalla frequenza con cui le persone (me compreso) creano array vuoti con qualcosa in più rispetto allo standard init - è come se volessi mantenere aperte le mie opzioni o qualcosa del genere. Weird – ColossalChris

13

Il passaggio di parametri non nulli è solo in parte la risposta.

Le nuove annotazioni di nullità Objective-C hanno enormi vantaggi per il codice sul lato Swift della recinzione, ma qui c'è un notevole vantaggio anche senza scrivere una riga di Swift. I puntatori contrassegnati come nonnull daranno ora un suggerimento durante il completamento automatico e genereranno un avviso se inviati nil invece di un puntatore appropriato.

Leggi NSHipster comprehensive article.

In oder per approfittare del contratto stesso nel proprio codice, utilizzare nonnull o nullable:

Obj-C

- (nullable Photo *)photoForLocation:(nonnull Location *)location 
-4

ottenuto lo stesso errore durante l'inizializzazione di un NSMutableArray con gli zeri,

[[NSMutableArray alloc] initWithObjects:0, 0, 0, 0, 0, nil]; 

cambiato in

[NSMutableArray arrayWithArray:@[@0, @0, @0, @0, @0]]; 
+0

Un 'NSMutableArray' è una matrice di oggetti. I letterali, come 0 o 1, non sono oggetti. '@ 0' è una scorciatoia per' NSNumber' (un oggetto) inizializzato con un valore di 0. – SwiftArchitect

Problemi correlati