ObjectiveCeeds › Objective-C: Speicherverwaltung zu Fuß

Objective-C: Speicherverwaltung zu Fuß

Von Manfred Kreß
Eine Array Klasse
Seite 6 von 6



Es soll noch eine weitere Klasse erstellt werden um die Sache weiter zu verdeutlichen, ein „Array Objekt“. Es soll eine Beliebige Anzahl an Objekten speichern und unsere Speicherverwaltung vollständig implementieren. Um dies zu realisieren müssen wie die Verwaltung dynamischer Arrays in c verwenden, und bauen einen „Wrapper“, der dies in Objective C kapselt. Die Klasse OCArray soll folgende Anforderungen erfüllen:
  • für die Anzahl der gespeicherten Objekte muss ein Zähler bestehen.
  • ein Objekt muss an das Array angefügt werden können (Einfügen ist nicht erforderlich).
  • der Zeiger auf ein Objekt an einem bestimmten Index muss zurückgegeben werden.
  • das Objekt eines beliebigen Index muss entfernt werden können (!= löschen im Sinne der Speicherverwaltung).
  • das Array muss unsere Speicherverwaltung implementieren.
Als Interface modelliert:
//
//  OCArray.h
//  RetainCount
//
#import <stdio.h>
#import <stdlib.h>
#import "OCObject.h"

@interface OCArray : OCObject {

	id * _OCObjectsStore;

	int _OCCount;
}

/*
	returns the number of objects stored by the reciever
*/
- (int) count;

/*
	adds object to the reciever and retains object
*/
- (void) addObject: (id)object;

/*
	return the object at the index
*/
- (id) objectAtIndex: (int)index;

/*
	removes the object at index from the recievers store and releases object
*/
- (void) removeObjectAtIndex: (int)index;

/*
 removes all objects and releases them
*/
- (void) removeAllObjects;

@end
Implementation:
//
//  OCArray.m
//  RetainCount
//

#import "OCArray.h"
#import  <objc/objc.h>

@implementation OCArray

- (id) init
{
	self = [super init];
	if (self != nil) {

		_OCCount = 0;
		_OCObjectsStore = malloc( _OCCount * sizeof (id));
	}
	return self;
}

- (void) cleanup
{
	[self removeAllObjects];
	free(_OCObjectsStore);
	[super cleanup];
}

- (int) count
{
	return _OCCount;
}

- (void) addObject: (id)object
{
	_OCCount++;
	_OCObjectsStore = realloc( _OCObjectsStore , _OCCount * sizeof (id));
	// missing error handling
	[(OCObject *)object retain];
	_OCObjectsStore [_OCCount - 1] = object;
}

- (id) objectAtIndex: (int)index
{
	return _OCObjectsStore [index];
}

- (void) removeObjectAtIndex: (int)index
{
	id theObject = [self objectAtIndex: index];
	[theObject release];

	int i = index+1;

	for (i ; i < _OCCount ; i++)
	{
		_OCObjectsStore [i-1] = _OCObjectsStore [i];
	}
	_OCCount--;
	_OCObjectsStore = realloc( _OCObjectsStore , _OCCount * sizeof (id)); 

	// missing error handling
}

- (void) removeAllObjects
{
	int i;

	for (i = 0 ; i < _OCCount ; i++)
	{
		id current = _OCObjectsStore [i];
		[current release];
	}

	_OCCount = 0;
	_OCObjectsStore = realloc( _OCObjectsStore , _OCCount * sizeof(id));
}

@end
Spielen Sie ein wenig mit dem Code. Im Projektordner gibt es eine Testfunktion für das Array. Weiter will ich die Entwicklung des eigenen Foundation Frameworks jetzt aber nicht treiben. Schließlich will ich Apple keine Konkurrenz machen. Ich hoffe die Funktionsweise der Speicherverwaltung in Objective C konnte mit dem Projekt anschaulich gemacht werden. Das komplette Projekt zum Download über Bitbucket. Oder direkt mit Mercurial auschecken: hg clone https://bitbucket.org/ObjectiveCeeds/retainyourself

« vorige Seite