Does the iOS SDK provide queues and stacks?

后端 未结 8 1735
情话喂你
情话喂你 2021-02-02 08:05

I\'m writing an iPhone app, and I\'m surprised that there seem to be no NSQueue or NSStack classes in Apple\'s Foundation Framework. I see that it would be quite easy to roll m

相关标签:
8条回答
  • 2021-02-02 08:11

    Here's my Stack class, in case it's useful to those who come after me. As you can see, the pop method involves enough code that you'd want to factor it out.

    Stack.h:

    #import <Foundation/Foundation.h>
    
    @interface Stack : NSObject {
        NSMutableArray *contents;
    }
    
    - (void)push:(id)object;
    - (id)pop;
    
    @end
    

    Stack.m

    #import "Stack.h"
    
    @implementation Stack
    
    // superclass overrides
    
    - (id)init {
        if (self = [super init]) {
            contents = [[NSMutableArray alloc] init];
        }
        return self;
    }
    
    - (void)dealloc {
        [contents release];
        [super dealloc];
    }
    
    // Stack methods
    
    - (void)push:(id)object {
        [contents addObject:object];
    }
    
    - (id)pop {
        id returnObject = [[contents lastObject] retain];
        if (returnObject) {
                [contents removeLastObject];
        }
        return [returnObject autorelease];
    }
    
    @end
    
    0 讨论(0)
  • 2021-02-02 08:12

    I have put a working iOS Objective C queue object on GitHub. The code was taken from various posts and by no means is owned by me.

    https://github.com/esromneb/ios-queue-object/

    If you see any problems please fork, and make a pull request!

    0 讨论(0)
  • 2021-02-02 08:14

    I'm a bit late to this party, but are you aware of CHDataStructures?

    http://cocoaheads.byu.edu/code/CHDataStructures

    0 讨论(0)
  • 2021-02-02 08:17

    No. You missed nothing. That's all. Objective-C is higher level language look like C. Low level control is not required.

    Cocoa classes are designed for easier use than efficiency. If you want to deal with performance, you have an option of raw C (or C++) implementation. Otherwise, just use easy way. Of course, early-optimization is evil.

    If you want a kind of encapsulation, just make a new class which contains NSMutableArray within it. Hide inner NSMutableArray and just expose what you want. But you'll realize this is unnecessary.

    0 讨论(0)
  • 2021-02-02 08:20

    as far as I know there is no generic class avaialbe. Try using the NSMutableArray, add via addObject and get first/last via objectAtIndex and removeObjectAtIndex.

    0 讨论(0)
  • 2021-02-02 08:24

    Another easy way would be to extend NSMutableArray's capabilities by making use of Objective C's categories. You can do that by adding two files to your project:

    NSMutableArray+Stack.h

    @interface NSMutableArray (StackExtension)
    
    - (void)push:(id)object;
    - (id)pop;
    
    @end
    

    NSMutableArray+Stack.m

    #import "NSMutableArray+Stack.h"
    
    @implementation NSMutableArray (StackExtension)
    
    - (void)push:(id)object {
        [self addObject:object];
    }
    
    - (id)pop {
        id lastObject = [self lastObject];
        [self removeLastObject];
        return lastObject;
    }
    
    @end
    

    Now you can use a regular NSMutableArray in every other file of your project like a stack and call push or pop on that object. Don't forget to #import NSMutableArray+Stack.h in those files. Here is some sample code how you can use your new NSMutableArray as a stack:

    NSMutableArray *myStack = [[NSMutableArray alloc] init]; // stack size = 0
    
    NSString *aString = @"hello world";
    [myStack push:myString];            // stack size = 1
    
    NSString *anotherString = @"hello universe";
    [myStack push:anotherString];       // stack size = 2
    
    NSString *topMostStackObject; 
    
    topMostStackObject = [myStack pop]; // stack size = 1
    NSLog("%@",topMostStackObject);
    
    topMostStackObject = [myStack pop]; // stack size = 0
    NSLog("%@",topMostStackObject);
    

    The log output will be:

    hello universe
    hello world
    
    0 讨论(0)
提交回复
热议问题