iOS: Wie Entferne Objekt aus dem Speicher mit ARC aktiviert?
Ich bin der Entwicklung einer iOS-app mit der iOS-5-SDK, die Automatische Referenz-Zählung aktiviert ist. Aber ich habe ein bestimmtes Objekt in großer Anzahl erstellt und freigegeben werden, müssen nach einem zweiten, da sonst das Gerät wird sehr langsam. Es sieht aus wie Sie werden nicht freigegeben, da das Gerät ist sehr langsam. Gibt es eine Möglichkeit, manuell ein Objekt freigeben, wenn ARC aktiviert ist?
EDIT: Mein code, das heißt 200 mal in der Sekunde zu generieren funkelt. Sie verblassen nach 0,8 Sekunden, so dass Sie nutzlos sind, dann.
int xanimationdiff = arc4random() % 30;
int yanimationdiff = arc4random() % 30;
if (arc4random()%2 == 0) {
xanimationdiff = xanimationdiff * -1;
}
if (arc4random()%2 == 0) {
yanimationdiff = yanimationdiff * -1;
}
Sparkle *newSparkle = [[Sparkle alloc] initWithFrame:CGRectMake(20 + arc4random() % 280, 20, 10, 10)];
//[newSparkle setTransform:CGAffineTransformMakeRotation(arc4random() * (M_PI * 360 /180))]; //Rotatie instellen (was niet mooi, net sneeuw)
[self.view addSubview:newSparkle];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.8];
[newSparkle setFrame:CGRectMake(newSparkle.frame.origin.x - xanimationdiff, newSparkle.frame.origin.y - yanimationdiff, newSparkle.frame.size.width, newSparkle.frame.size.height)];
newSparkle.alpha = 0;
[UIView commitAnimations];
Funkeln Objekt-code:
#import "Sparkle.h"
@implementation Sparkle
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sparkle.png"]]];
}
return self;
}
@end
InformationsquelleAutor icant | 2011-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN: Sie können nicht direkt Steuern, Wann ein Objekt freigegeben wird, ABER Sie kann indirekt dazu, dass es passiert. Wie? Denken Sie daran, was ARC bedeutet GENAU das. Im Gegensatz zu human-Codierung Konvention, ARC analysiert den code und fügt release-Anweisungen, sobald OBJEKTE freigegeben werden KÖNNEN. Dies befreit den Speicher für neue Zuordnungen sofort, was toll ist/notwendig ist.
Was bedeutet das einstellen eines Objekts auf null, oder einfach so dass eine variable geht out of scope ... etwas, das BEWIRKT, dass EIN 0 RETAIN COUNT Kräfte ARC seine Freilassung fordert es.
Es muss ..., weil es wäre Leck, sonst.
Das ist nicht wahr in allen Fällen. Wenn Sie nicht über bestimmte compiler-Optimierungen eingeschaltet (in der Regel, wenn Sie nicht mit im release-Modus) BOGEN wird nicht sofort frei Objekte.
Einstellung auf null wird in der Regel durchgeführt 'nachdem' ein Objekt ist angeblich dealloc ' ed, - zur Vermeidung von dangling pointers. Wie könnte die Einstellung auf null-die Freilassung wird schließlich dazu führen, dass die dealloc? Sieht aus wie die Umkehrung von Ursache & Wirkung.
Teilweise wahr: "Sie können nicht direkt Steuern, Wann ein Objekt freigegeben wird". Sie können
autorelease pools
zu kontrollieren. Autorelease Pool Blocks. "Ausführen" - Schleifen und Autorelease-PoolsInformationsquelleAutor The Rat
Umgeben Sie den Abschnitt von code, der genannt wird 200 mal mit einer @autoreleasepool { ... } - Anweisung. Dadurch wird der Speicher sofort freigegeben, im Gegensatz zu warten, die Kontrolle zu gehen den ganzen Weg zurück, bis die Ereignis-Kette, um die top-level-autorelease pool.
InformationsquelleAutor rvijay007
Fand ich die Antwort, es war wirklich sehr dumm. Ich wusste nicht, entfernen Sie die Perlen aus dem superview. Jetzt Entferne ich Sie nach 0,8 Sekunden mit einem timer und führt es wieder großartig 🙂
InformationsquelleAutor icant
Mit ARC nicht nennen
dealloc
,release
oderretain
, obwohl, können Sie immer noch behalten und die release CoreFoundation Objekte (NB: Sie implementieren könnendealloc
Methoden für Ihre eigenen benutzerdefinierten Unterklassen, aber Sie können Sie nicht anrufensuper dealloc
). So ist die einfache Antwort ist 'Nein', die man leider nicht manuell freigeben eines Objekts bei der Verwendung von ARC.Ich würde überprüfen du bist sicher, dass Sie nicht veröffentlicht werden, weil in der Theorie, wenn Sie nicht mehr auf ein Objekt verweisen, sollte es freigegeben werden. Was tun Sie mit diesen Objekten, wenn Sie Sie erstellen? Sie einfach erstellen Ihnen dann umgehend zu vernichten?
Vielleicht könnten Sie nach dem code, den Sie verwenden /der property - Deklarationen-diese
weak
oderstrong
referenzierten Objekte?kann Sie nicht einfach festlegen, Objekt - 'nil'? Ich bin besorgt, weil ich bin Gebäude viele NSArray und Dictionary-Objekte in der Schleife und fügen Sie diese im globalen array, so dass ich Sie nicht brauchen danach. Wie ARC entfernt Objekte gebaut, die in der Schleife?
Das ist nicht ganz wie es funktioniert, wenn Sie Objekte in einer for-Schleife und fügen Sie diese in ein globales array wird Sie immer noch beibehalten werden. Sie kann nicht freigegeben werden, bis Sie entfernt aus dem globalen array (dh Ihre retain count wird auf null gesetzt).
InformationsquelleAutor lxt