#import <objc/Object.h>
@interface List : Object                          // List is a subclass of the superclass Object
{
    int list[100];                                // These are instance variables.
    int size;
}
/* Public methods */
- free;
- (int) addEntry: (int) num;
- print;
/* Private methods */
/* Other programs should not use these methods. */
- resetSize;
@end
List.m:
#import "List.h"
@implementation List
+ new                                           // factory method
{
    self = [super new];
    [self resetSize];
    return self;
}
- free
{
    return [super free];
}
- (int) addEntry: (int) num
{
    list[size++] = num;
    return size;
}
- print
{
    int i;
    printf("\n");
    for (i = 0; i < size; ++i)
        printf ("%i ", list[i]);
        puts("");
    return self;                                // Always return self
                                                                                                // if n
othing else makes sense.
}
- resetSize
{
    size = 0;
    return self;
}
Stack.h:
#import <objc/Object.h>
typedef struct StackLink {
        struct StackLink        *next;
        //void                  *data;
        int                     data;
} StackLink;
@interface Stack : Object
{
        StackLink *top;
    unsigned int size;
}
- free;
- push: (int) anInt;
- addEntry: (int) anInt;
- (int) pop;
- (unsigned int) size;
@end
Stack.m:
#import "Stack.h"
#import <stdlib.h>
@implementation Stack
#define NULL_LINK (StackLink *) 0
+ new
{
    self = [super new];
    top = NULL_LINK; //(StackLink *) 0;
    return self;
}
- free
{
    StackLink *next;
    while (top != NULL_LINK)
    {
        next = top->next;
        free ((char *) top);
        top = next;
    }
    return [super free];
}
- push: (int) value
{
    StackLink *newLink;
    newLink = (StackLink *) malloc (sizeof (StackLink));
    if (newLink == 0)
    {
        fprintf(stderr, "Out of memory\n");
        return nil;
    }
    newLink->data = value;
    newLink->next = top;
    top = newLink;
    size++;
    return self;
}
- addEntry: (int) value
{
        return [self push: value];
}
- (int) pop
{
    int value;
    StackLink *topLink;
    if (0 != size)
    {
        topLink = top;
        top = top->next;
        value = topLink->data;
        free (topLink);
        size--;
    }
    else
    {
        value = 0;
    }
    return value;
}
- (unsigned int) size
{
    return size;
}
- print
{
        StackLink *startLink;
        int i = size;
        startLink = top;
        while (startLink) {
                printf("Stack[%d] = %d\n", i, startLink->data);
                startLink = startLink->next;
                i--;
        }
        return self;
}
@end
main.m:
#import <objc/Object.h>
#import "List.h"
#import "Stack.h"
//int main(int argc, char *argv[])
void perform (id obj)
{
        [obj addEntry: 5];
        [obj print];
        [obj addEntry: 6];
        [obj addEntry: 3];
        [obj print];
}
main()
{
        id list;
        list = [List new];
        perform(list);
        [list free];
        id stack;
        stack = [Stack new];
        perform(stack);
        [stack free];
        printf("\n");
        return 0;
}
Makefile:
.SUFFIXES: .o .m
.m.o:
        $(CC) -c $(CFLAGS) $< -o $@
# Macros
CC=gcc
#CFLAGS=-Wall -Wno-import -mtune=core2 -mfpmath=sse -ffast-math -msse3 -fobjc-exceptions
CFLAGS=-Wno-import -mtune=core2 -g
LDFLAGS=-lobjc
SRCS=main.m List.m Stack.m
OBJS=$(SRCS:.m=.o)
EXECUTABLE=main
.PHONY: all
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $(OBJS)
#$(OBJS): $(SRCS)
#       echo "$(CC) -c $(CFLAGS) $< -o $@"
clean:
        rm -f *.o $(EXECUTABLE)
TAGS: $(SRCS)
        ctags -R $(SRCS)