私はiPhoneアプリを書いていて、Appleの Foundation Framework にNSQueueまたはNSStackクラスがないように思えます。 NSMutableArray から始めれば、自分でロールするのは非常に簡単だと思うので、何かを見逃していない限り、そうします。私は何かを見逃しましたか?
私が知る限り、利用可能なジェネリッククラスはありません。 NSMutableArrayを使用してみてください。addObjectを介して追加し、objectAtIndexとremoveObjectAtIndexを介して最初と最後を取得してください。
私の後に来る人に役立つ場合に備えて、これが私のStackクラスです。ご覧のとおり、popメソッドには、それを分解したいだけの十分なコードが含まれています。
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
私はこのパーティーに少し遅れましたが、CHDataStructuresを知っていますか?
別の簡単な方法は、Objective Cのカテゴリを利用してNSMutableArray
の機能を拡張することです。これを行うには、プロジェクトに2つのファイルを追加します。
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
これで、スタックのようにプロジェクトの他のすべてのファイルで通常のNSMutableArray
を使用し、そのオブジェクトでPush
またはpop
を呼び出すことができます。それらのファイルで#import NSMutableArray+Stack.h
を忘れないでください。以下は、新しいNSMutableArray
をスタックとして使用する方法のサンプルコードです。
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);
ログ出力は次のようになります。
hello universe
hello world
動作するiOS Objective CキューオブジェクトをGitHubに配置しました。コードはさまざまな投稿から取得されたものであり、決して私の所有ではありません。
https://github.com/esromneb/ios-queue-object/
何か問題があったらフォークしてプルリクエストを送ってください!
ObjectiveSugar は、非常に人気のあるCocoaPodであり、他のすばらしい機能の中で、Push
およびpop
API呼び出しをNSMutableArray
で提供します。確かに、それはiOS SDKにはありませんが、同じものを探していたのでここで共有しています。これは私が使ったソリューションでした(そして、このCocoaPodをすでに使用していたことは確かに害にはなりませんでしたコードベース)。
はい、NSMutableArrayはスタックまたはキューを兼ねています。 (キューとしては少し非効率的です。)
C++のstack
およびqueue
アダプターを使用することもできますが、Objective-Cオブジェクトを一緒に格納する場合、メモリ管理が少し面倒になります。
いいえ、何も見逃していません。それで全部です。 Objective-Cは、Cに似た高レベルの言語です。低レベルの制御は必要ありません。
Cocoaクラスは、効率よりも使いやすいように設計されています。パフォーマンスを処理したい場合は、生のC(またはC++)実装のオプションがあります。それ以外の場合は、簡単な方法を使用します。もちろん、早期最適化は悪です。
ある種のカプセル化が必要な場合は、NSMutableArrayを含む新しいクラスを作成してください。内側のNSMutableArrayを非表示にし、必要なものを公開します。しかし、これは不要であることに気付くでしょう。