autorelease hatálya

szavazat
6

Csodálkoztam, hogy a autorelese működik az iPhone. Azt azonban, hogy ha egyszer Levél autorelease egy tárgy akkor garantált , hogy megmarad végéig terjed ki a blokkot a autoreleaseküldték. Ez helyes?

Azt inicializálása a kilátás a NIB az applicationDidFinishLaunchingalábbi képernyő:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

    loginViewController = [[[LoginViewController alloc] initWithNibName:@LoginView bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

és a kilátás nem jelenhet meg, mind ott volt a képernyőn volt UIWindow

Most, ha azt eltávolították a autoreleasevégétől az inicializálási minden simán ment onnan.

Ez miről szól?

Cheers, K.

A kérdést 24/02/2009 14:57
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
13

Ha telefonál autorelease, akkor adja az objektum tulajdonjogát az aktuális autorelease medencében. A futás hurok létrehoz egy új autorelease mielőtt azt elküldi egy esemény (például applicationDidFinishLaunching:), és elpusztítja a medencében, amikor az esemény befejeződik.

Ha adsz tulajdonjogát LoginViewControllera autorelease medence, akkor azt kiadta csak miután a applicationDidFinishLaunching:hozamok. Amikor nézetvezérlőben felszabadítja magát, megszünteti a kilátás az SuperView (az ablak ebben az esetben).

Az alkalmazás megbízottja kell tartani tulajdonjogát LoginViewControllerés releaseez az alkalmazás delegátus deallocmódszer (vagy ha kész van a bejelentkezési és költözött át egy másik nézet).

Válaszolt 24/02/2009 20:50
a forrás felhasználó

szavazat
4

Bővíteni Don válasza, lehet, hogy kissé zavaros, hogy azt mondják: „adsz az objektum tulajdonjogát az aktuális autorelease medencében.” Ez talán félreérthető, hogy azt a tárgyat garantáltan meg kell semmisíteni, ha a pool autorelease lemerült. Ez nem helyes (bár ez fog történni ebben az esetben). Küldés -autoreleasekéri, hogy a autorelease medence küldjön egy -releaseüzenetet, ha lemerült. Ha ez -releaseaz üzenet teszi retainCount = 0, akkor az objektum megsemmisül.

Így annak érdekében, hogy amit Don ajánlja, akkor létre kell hozni egy Ivar nyomon követni ezt a nézetet vezérlő. A magyarázata, hogy miért véli, eltűnik pontosan jobbra; de nem akarom, hogy csak szivárog nézetvezérlőben. Azt akarod, hogy kapaszkodj meg, és engedje el, ha végeztél vele.

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
Válaszolt 28/04/2009 23:13
a forrás felhasználó

szavazat
0

Mivel Ön adja hozzá LoginViewControllera autorelease pool ez is kiadta a végén a futás hurok. Amikor ez történik, akkor is leadja véleménye és eltávolítja a nem jelenik meg.

Válaszolt 24/02/2009 18:50
a forrás felhasználó

szavazat
0

A autoreleasepool megtisztítják végén a runloop. Ez azt jelenti, ameddig csak metódusokat és csinálni dolgokat, még mindig ott van.

Nem látom a hiba a kódban, de az ablak megmarad megfelelően a példa.

Válaszolt 24/02/2009 15:09
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more