2012-09-17 17 views
7

Ich habe ein Xcode 3.2-Projekt. Ich möchte dieses Projekt in ARC konvertieren, um die Leistung zu verbessern. Ich befolge diese Schritte.Umwandlung eines Nicht-ARC-Projekts in ARC

Bearbeiten-> Refactor-> Konvertieren in Objective C ARC

Ich habe einige .mm Dateien bekam, auf die ich die ARC bin Deaktivierung mit -fno-objc-Bogen. Aber auch nach

dies bekomme ich viele Fehler (ARC-Probleme). Für zB hauptsächlich in self = [super init] call, der

Fehler kann nicht zu self außerhalb einer Methode in der init-Familie zuweisen. Kann

jemand sagen mir bin ich die richtigen Schritte?

Antwort

15

ich versuchte, ein projet ARC zu konvertieren und nach dem Erstellen eines neuen und einschließlich der Dateien von der alten - eine der Fragen bekam ich

war

nicht auf ‚Selbst‘ außerhalb eines zuweisen Methode in der init Familie

der Selektor Name mit init beginnen muss - nicht nur das - in meinem Fall den init Wähler war:

-(id)initwithPage:(unsigned)pageNum {...} 

Beachten Sie das kleine "w".

Ich habe es geändert:

-(id)initWithPage:(unsigned)pageNum {...} 

Beachten Sie die Hauptstadt 'W'!

Mein Problem wurde gelöst.

Ich hoffe, das hilft jemandem.

+1

Sogar ich habe es in meinem XCode auch beobachtet. – Raj

+1

Eine zusätzliche Anmerkung: Dies wird erwähnt (wenn auch sehr subtil) in der LLVM-Dokumentation: "Ein Selektor ist in einer bestimmten Selektorfamilie enthalten, wenn die erste Komponente des Selektors unter Berücksichtigung aller führenden Unterstriche entweder vollständig aus dem Namen der Methodenfamilie oder besteht es beginnt mit diesem Namen, gefolgt von einem Zeichen ** außer einem Kleinbuchstaben. ** " – Xono

+0

und vergiss nicht - (id) den Rückgabewert! – JeanNicolas

1

Ray Wenderlich des Tutorials haben eine ziemlich gute ARC-Umwandlung zweiteiligen Tutorial, welches Detail sollten die richtigen Schritte zu ergreifen: es Sie haben die Beschreibung ziemlich fasst Part 1Part 2

In Bezug auf den Fehler auf : Sie ordnen self in einer Methode zu, die the standard for init methods nicht erfüllt. Ich kann nicht dafür sprechen, ob das vor dem ARC legal ist, aber es ist definitiv nicht mehr. Um dieses Problem zu lösen, machen Sie es entweder zu einer init-Methode (folgt der init-Praxis, eine super-init-Methode in self zu starten, initialisieren beliebige Werte und gibt self zurück) oder entfernen Sie die Zuweisung zu self darin. Für andere Fehler, poste irgendwas, mit dem du ein Problem hast (viele von ihnen sind in den Tutorials von Ray enthalten), und wir werden tun, was wir können.

+1

Es ist völlig legal, aber die Frage ist: In welchem ​​Szenario möchten Sie 'self' außerhalb einer' init' Methode zuweisen? – nielsbot

+1

Es ist durchaus möglich, dass seine Methoden ein Init-ähnliches Verhalten haben, aber einfach das initiierte Objekt nicht zurückgeben (d.h. obj = [Obj alloc]; "[obj initWithData];" aufrufen, wobei initWithData void zurückgibt). Da init-Methoden einen Zeiger zurückgeben müssen, würde es vor dem ARC funktionieren, aber bei der Konvertierung Massenprobleme verursachen. Zum Glück, wenn das alles ist, sollte es nur darum gehen, die Erklärungen zu aktualisieren. – Xono