Mi az a Memory Management

Hasonló dokumentumok
Objective-C PPKE-ITK

ios alkalmazásfejlesztés Koltai Róbert

ios alkalmazásfejlesztés

Az iphone fejlesztés alapjai. I. előadás

Az iphone fejlesztés alapjai

Programozási nyelvek Java

Java és web programozás

JNDI - alapok. Java Naming and Directory Interface

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

ios alkalmazásfejlesztés alapjai Nagy Aszter András BME MIK

Programozás C++ -ban

ios alkalmazásfejlesztés Koltai Róbert

Széchenyi István Egyetem

Statistical Dependence

JAVA PROGRAMOZÁS 2.ELŐADÁS

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Java és web programozás

Java és web programozás

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

iphone programozás alapjai

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

Programozási nyelvek Java

Programozási nyelvek Java

Programozási nyelvek Java

Az egészségügyi munkaerő toborzása és megtartása Európában

Csatlakozás a BME eduroam hálózatához Setting up the BUTE eduroam network

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

On The Number Of Slim Semimodular Lattices

Phenotype. Genotype. It is like any other experiment! What is a bioinformatics experiment? Remember the Goal. Infectious Disease Paradigm

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

Kölcsönös kizárás, atomicitás, szemafor.

Objektumok inicializálása

1. Gyakorlat: Telepítés: Windows Server 2008 R2 Enterprise, Core, Windows 7

Globális operátor overloading

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

3. Osztályok II. Programozás II

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Osztályok. 4. gyakorlat

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

TestLine - OO Programozás alapjai Minta feladatsor

Személyes adatváltoztatási formanyomtatvány - Magyarország / Personal Data Change Form - Hungary

Programozás C++ -ban 2007/7

Objektumorientált programozás C# nyelven

Memóriakezelés, dinamikus memóriakezelés

Programozás II. 4. Dr. Iványi Péter

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

Riak. Pronounced REE-ahk. Elosztott adattároló eszköz. Molnár Péter

ARM processzorok felépítése

Több app. Egy kódbázis

Személyes adatváltoztatási formanyomtatvány- Magyarország / Personal Data Change Form - Hungary

Szoftver-technológia II. Tervezési minták. Irodalom. Szoftver-technológia II.

ISA szimulátor objektum-orientált modell (C++)

Generikus Típusok, Kollekciók

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Programozás C++ -ban

iphone programozás alapjai I. Gyakorlat

Programozás II gyakorlat. 8. Operátor túlterhelés

EN United in diversity EN A8-0206/419. Amendment

A évi fizikai Nobel-díj

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

White Paper. Grounding Patch Panels

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

OOP #14 (referencia-elv)

C# versus Java. Óbudai Egyetem, Java Standard Edition Mérnök Informatikus szak, BSc Labor 3. Bedők Dávid v0.4

Komponens alapú fejlesztés

Android Pie újdonságai

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Angol Középfokú Nyelvvizsgázók Bibliája: Nyelvtani összefoglalás, 30 kidolgozott szóbeli tétel, esszé és minta levelek + rendhagyó igék jelentéssel

Léptetőmotorok. Előnyök: Hátrányok:

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

C++ programozási nyelv

Mobil alkalmazások fejlesztése. Készítette: Szabóné Nacsa Rozália

9. MPI

Mutatók és mutató-aritmetika C-ben március 19.

Programozási nyelvek II.: JAVA

SQL Server High Availability

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Objektumorientált programozás C# nyelven

Programozási nyelvek Java

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet. Correlation & Linear. Petra Petrovics.

A BÜKKI KARSZTVÍZSZINT ÉSZLELŐ RENDSZER KERETÉBEN GYŰJTÖTT HIDROMETEOROLÓGIAI ADATOK ELEMZÉSE

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Pénzügyi algoritmusok

Segédanyag: Java alkalmazások gyakorlat

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Basic Arrays. Contents. Chris Wild & Steven Zeil. May 28, Description 3

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

1. Ismerkedés a Hyper-V-vel, virtuális gépek telepítése és konfigurálása

Smart Pointer koncepciója

C#, OOP. Osztályok tervezése C#-ban

Stateless Session Bean

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Best Practices for TrusBest Practices for Trusted Digital Repositories in HOPE. ted Digital Repositories in HOPE.

HU ISSN

Átírás:

Memory management

Mi az a Memory Management A memória kezelés egy olyan aspektusa a programozásnak, ahol az egyes objektumok életciklusát vezéreljük, felszabadítva azokat, ha már nincs rájuk szükség. Ez sok szempontból kritikus feladat, a memória egyrészt véges, mástrészt a növekvő "memory footprint" teljesítmény csökkenést okoz.

Az eddigi tapasztalatok A c++ hoz képest a java jóval kényelmesebb! explicit meg kell határozni, mikor szabadítom fel a memóriát +1 dolog, amire figyelni kell sok hiba forrása, sok debug!

Ismerős fogalmak foglalás felszabadítás c malloc / calloc / stb free c++ new delete java new - (A legideálisabb)

static / stack / heap std::map<std::string, int> mymaponstack; mymaponstack["key"] = 5; std::map<std::string, int>* mymaponheap = new std::map<std::string, int>(); (*mymaponheap)["key"] = 5;

ios Memory Management ios platformon a memória kezelése referencia számlált megoldással valósul meg. Ha létrehozunk vagy másolunk egy objektumot, a referencia számlálója 1 lesz. Ezután ha más objektumo(k) birtokolni szeretné(k) a létrehozott objektumot, a referencia számláló nő. (+1) Ha a birtoklól objektumok már nem tartanak igényt a létrehozott objektumra lemondanak róla, a referencia számláló csökken. (-1) Ha a referencia számláló nullára csökken az objektum felszabadul.

Objective C nyelven //retain count = 1 NSNumber* number = [[NSNumber alloc] initwithfloat:12.3f]; //az objektum birtoklása, retain count = 2 [number retain]; //objektum elengedése (birtoklás lemondása), retain count = 1 [number release]; //objektum elengedése, retain count = 0, dealloc [number release];

[someobject retaincount] SOHA ne hasznaljuk! 1. The absolute retain count of an object may change at any time once an object has been passed through any system API. 2. Any subclass of any system provided class counts as through system API ; the retain count may be impacted by implementation details. 3. The retain count never reflects whether an object is autoreleased. 4. Autorelease is a per-thread concept whereas retain counts are global; race condition derived hilarity can easily ensue. 5. The retaincount method can never return 0. 6. Some classes are implemented as singletons some of the time. 7. Some classes may internally manipulate their retain count directly (I.e. no swizzle for you!). 8. While retain/release are effectively thread safe, there is always a race between calling retaincount and having the actual retain count change in some other execution context.

Objective C memory management négy fő szabály Te birtoklod azt az objektumot, amit te hoztál létre. Egy objektumot birtokba vehetsz, ha azt retain-eled. Ha már nincs szükséged egy objektumra, a birtoklási viszonyt meg kell hogy szüntestd Birtoklási viszonyt nem szüntethetsz meg olyan objektumnál, amit nem te birtokolsz

Te birtoklod azt az objektumot, amit te hoztál létre. A metódusok, amik objektumokat létrehoznak tartalmazzák az alábbi kifejezéseket: alloc, new, copy, mutablecopy Student* student = [[Student alloc] init]; NSNumber* somenumber = [NSNumber new]; NSString* copyofsomestring = [somestring copy];

Egy objektumot birtokba vehetsz, ha azt retain-eled. 1 Általában két föbb eset különíthető el: 1. accessor vagy init függvény esetén birtokolni szeretnénk adott objektumot, hogy beállíthassuk egy property értékének @property (nonatomic, retain) NSString* name; - (void)setname:(nsstring *)newname { [_name release]; _name = [newname retain]; }

Egy objektumot birtokba vehetsz, ha azt retain-eled. 2 2. biztosítani szeretnénk hogy az adott objektum érvényes marad adott kontextusban id problematicnumber = nil; NSMutableArray* numbers = [NSMutableArray arraywithobjects:@5, @13, @12, nil]; problematicnumber = [numbers objectatindex:0]; [numbers removeobjectatindex:0]; NSLog(@"problematicNumebr:%d", [problematicnumber intvalue]);

Ha már nincs szükséged egy objektumra, a birtoklási viszonyt meg kell hogy szüntestd [student release];

Birtoklási viszonyt nem szüntethetsz meg olyan objektumnál, amit nem te birtokolsz [someobjidontown release];

Property-k újra @property (attrib1, attrib2) type name; retain copy - lásd birtokba vétel - retain szabály - hasonlóképp az előzőhöz, csak nem retain-eljük, hanem egy másolatot készítüunk róla assign - sima értékadás memória management nélkül

Autorelease Az autorelease üzenet segítségével késleltetett release üzenetet küldhetünk az objektumoknak. Ez akkor hasznos, amikor egy objektum birtoklásáról lemondunk, de nem szeretnénk, hogy az azonnal felszabaduljon.

Autorelease példa //Vegyük példának ezt a gyártófüggvényt: + (Student*)studentWithName:(NSString*)name { Student* student = [[Student alloc] initwithname:name]; return [student autorelease]; } //valahol a kódban... Student* student = [Student studentwithname:@"vince"]; NSLog(@"sutdent name:%@", student.name); //ha birtokolni szeretnénk, küldünk neki retain üzenetet, ha nem akkor nem a mi felelőségünk a felszabadítás

Autorelease konvenció Minden olyan metódus, ami objektumot gyárt, és nincs benne az alloc, new, copy autorelese-elt objektumot ad vissza. Ez az elnevezésben is látszik: (sokszor osztályszintű metódusok) //str autorelase-elt NSString* str = [NSString stringwithformat:@"%d", 15]; //strretained-et birtoklom NSString* strretained = [[NSString alloc] initwithformat:@"%d", 15]; //tmpdict autorelase-elt NSDictionary* tmpdict = [NSDictionary dictionary]; //tmpdict-et birtoklom NSDictionary* tmpretained = [[NSDictionary alloc] init];

Autorelease egyszerűsít A két megoldás teljesen ekvivalens, de a második egyértelműbb, könnyebb követni UIView *view = [[UIView alloc] initwithframe:frame]; [self addsubview:view]; [view release]; UIView *view = [[[UIView alloc] initwithframe:frame] autorelease]; [self addsubview:view];

Mikor hivódik a release? Autorelease blokk végénél. NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; //... NSString* str = [NSString stringwithformat:@"%d", 15]; //... [pool drain];

Mikor nem érdemes használni autorelease-t? nagyon! szélsőséges példa, de előfordulhat... - (void)somemethod { for (int i = 0; i < 1000000; i++) { id tempobject = [[[SomeClass alloc] init] autorelease]; //... } }

Ahoz, hogy a memory management működjön... Mindenkinek be kell tartania a szabályokat és követnie a konvenciókat. A rendelkezésre álló könyvtárak, keretrendszerek mind feltételezik ezek teljes megértését és használatát

ARC Automatic Reference Counting...

ARC "Automatic Reference Counting (ARC) is a compilerlevel feature that simplifies the process of managing the lifetimes of Objective-C objects. Instead of you having to remember when to retain or release an object, ARC evaluates the lifetime requirements of your objects and automatically inserts the appropriate method calls at compile time."

ARC használata Az ARC bevezetésével egy két megszorítás is jött. Például a klasszikus management metódusok nem hívhatók (retain, release, autorelase) http://developer.apple. com/library/ios/#releasenotes/general/whatsnewinios/arti cles/ios5.html

ARC property változások Két referencia típust különböztet meg. strong / weak A strong tökéletesen analóg a retain-es "régi" verzióval A weak egy intelligens assign. (ha a objektum melyreől referenciánk van felszabadul autómatikusan nil értéket kap a property!)