コードはとなり、おそらくとなりますので、注意して使用してください。
私たちは、次のクラス・カテゴリー定義:
@interface TheSpecificNSStreamClass (ProposedCategory)
@property (nonatomic, strong, readonly) NSArray* associatedRunLoops;
- (void)myScheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
- (void)myRemoveFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
@end
と実装:
今
@implementation TheSpecificNSStreamClass (ProposedCategory)
- (NSArray*)associatedRunLoops
{
return [NSArray arrayWithArray:objc_getAssociatedObject(self, @"___associatedRunloops")];
}
- (void)myScheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
{
NSMutableArray* runloops = objc_getAssociatedObject(self, @"___associatedRunloops");
if(runloops == nil)
{
runloops = [NSMutableArray array];
objc_setAssociatedObject(obj, @"___associatedRunloops", runloops, OBJC_ASSOCIATION_RETAIN);
}
[runloops addObject:aRunLoop];
[self myScheduleInRunLoop:aRunLoop forMode:mode];
}
- (void)myRemoveFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
{
NSMutableArray* runloops = objc_getAssociatedObject(self, @"___associatedRunloops");
[runloops removeObject:aRunLoop];
[self myRemoveFromRunLoop:aRunLoop forMode:mode];
}
@end
、アプリケーションデリゲートでのいくつかの場所で、私たちは2つのオリジナルのメソッドを交換する方法のスウィズリングを使用実装:
Method origMethod = class_getInstanceMethod([TheSpecificNSStreamClass class], @selector(scheduleInRunLoop:forMode:));
Method altMethod = class_getInstanceMethod([TheSpecificNSStreamClass class], @selector(myScheduleInRunLoop:forMode:));
if ((origMethod != nil) && (altMethod != nil))
{
method_exchangeImplementations(origMethod, altMethod);
}
origMethod = class_getInstanceMethod([TheSpecificNSStreamClass class], @selector(removeFromRunLoop:forMode:));
altMethod = class_getInstanceMethod([TheSpecificNSStreamClass class], @selector(myRemoveFromRunLoop:forMode:));
if ((origMethod != nil) && (altMethod != nil))
{
method_exchangeImplementations(origMethod, altMethod);
}
結果の配列にはすべて関連するNSRunLoop
。
エディタがObjective-Cランタイムタグを削除しましたが、質問に対する回答が表示されませんでした。答えがあれば、それはランタイムの質問に非常によく関わっていると私は信じています。したがって、ランタイムタグはそのままの状態にしておいてください。 – xyzzycoder
_answer_が特定のドメインに存在する可能性があるということは、_question_にそのようなタグを付けなければならないという意味ではありません。 ObjCランタイムは、スレッド、ストリーム、および実行ループよりも低いレベル(または少なくとも異なるもの)です。これはフレームワークの概念です。 –
フレームワークに名前を付けることはできますか?あなたはストリームオブジェクトの実際のクラスを知っていますか? 'NSInput' /' OutputStream'またはカスタムサブクラスですか? –