Liten Datorhandbok För Målmedvetna

Academic Computer Club, Umeå Universitet, 2000


Macintosh Programmering

Minne

Macintoshen arbetar med två typer av allokerat minne. En pekare (pointer) är en variabel som pekar till information någonstans i minnet. Ett handtag (handle) är en pekare som pekar på en huvudpekare. Denna huvudpekare pekar i sin tur på minnesblocket. Fördelen med handtag är att datorn kan flytta runt dem i minnet om den behöver göra plats för nya minnesblock. Då behöver den bara ändra huvudpekaren, så är alla referenser till informationen fortfarande korrekta. Du kommer åt data som finns i ett handtag genom att göra en dubbel avreferering: **handle.

Du skapar ett nytt handtag av storlek size genom kommandot:

handle = NewHandle(size);

När du har använt informationen i handtaget färdigt kan du frigöra minnet igen genom kommandot:

DisposeHandle(handle);

Notera att du kommer att få allvarliga fel i ditt program om du försöker komma åt någonting i minnet som du gjort dig av med på detta sätt.

Du kan kontrollera storleken som har allokerats åt ett visst handtag genom kommandot:

size = GetHandleSize(handle);

Du kan också ändra storleken på blocket. Informationen som lagras i blocket förändras inte av att storleken ändras. Naturligtvis kan information trunkeras på slutet om handtaget görs för litet, men i övrigt är informationen intakt.

SetHandleSize(handle, size);

Motsvarande funktioner finns naturligtvis även för pekare:

ptr = NewPtr(size); DisposePtr(ptr); size = GetPtrSize(ptr); SetPtrSize(ptr, size);

Om du behöver allokera stora mängder minne kan det vara bra att veta hur mycket minne som finns fritt i minnet. Det kan du ta reda på med funktionerna:

freeMemory = FreeMem(); largestAllocatableBlock = MaxMem(&dummyLong);

Om allokering av ett handtag eller en pekare misslyckas sätts variabeln till 0L.

Att använda handtag kan ibland ställa till med problem. Om en funktion tar en pekare som argument och du skickar den ett avrefererat handtag (*handle), så kommer pekaren att bli ogiltig om blocket skulle flyttas under det att funktionen utförs. Många av systemfunktionerna flyttar block i minnet för att göra plats för de egna strukturer de allokerar. Därför måste du alltid låsa ett handtag, det vill säga göra det oflyttbart, innan du anropar en systemfunktion med det avrefererade handtaget. Det görs genom kommandot:

HLock(handle);

När du är klar med anropet, bör du låsa upp blocket igen, så att det kan flyttas och lämna plats för andra block. Det gör du med kommandot:

HUnlock(handle);

Bland minnesrutinerna finns det också en funktion för att kopiera data mellan olika platser i minnet. Det görs genom anropet:

BlockMove(sourcePtr, destPtr, noOfBytesToMove);

Det ska också nämnas att Macintoshen saknar funktioner för att köra program i skyddade minnesområden. Det betyder att om det blir fel i ett program, så kan dess rutiner skriva över minnet som används av andra program, så att även dessa program råkar ut för fel. Resultatet blir oftast att hela datorn hänger sig. Det är därför viktigt att man är extra noggrann med minneshanteringen när man programmerar Macintoshen. Om man vill kan man använda sig av speciella avlusningsprogram, som kontrollerar alla minessanrop så att de är korrekta.

Författat av Niklas Frykholm


Bakåt , Framåt , Upp, Huvudsida
Denna sida ändrades sist av handbok den 08/05 1996 18:09:48.
Last modified Wednesday, 08-May-1996 18:09:48 CEST