私は、Objective-CのClass型のargsのリストを解析したいと考えています。私は現在、リストを解析して解析するたびにEXEC_BAD_ACCESSを取得しています。リストを解析する実装を次に示します。タイプのクラスvarargsのリストを解析する
#import <Foundation/Foundation.h>
@interface NSArray (Args)
+ (NSArray *)arg_fromArgs:(id)clazz, ... NS_REQUIRES_NIL_TERMINATION;
@end
#import "NSArray+Args.h"
@implementation NSArray (Args)
+ (NSArray *)arg_fromArgs:(id)clazz1, ... {
NSMutableArray *arguments = [NSMutableArray new];
id eachObject;
va_list argumentList;
if (clazz1)
{
[arguments addObject:clazz1];
va_start(argumentList, clazz1);
while ((eachObject = va_arg(argumentList, id)))
{
[arguments addObject: eachObject];
}
va_end(argumentList);
}
return [NSArray arrayWithArray:arguments];
}
@end
while ((eachObject = va_arg(argumentList, id)))
行が不正なアクセスを取得する場所です。私はそれをどのように呼び出すのですか:
NSArray *classes = [NSArray arg_fromArgs:[Class1 class], [Class2 class], [Class3 class], nil];
私はid変数をClassに変更しようとしましたが、それでも何もしません。どのように私はこれを達成することができるかについてのアイデア(クラスの配列を自分のメソッドに直接渡すことを除いて)?
注:このクラッシュは物理デバイスでのみ発生します。それはシミュレータ上で完璧に動作します。事前に
おかげ
EDIT
これは、私がnewacctの提案に基づいて、それを解決する方法です。最初のクラスを通過する必要がない方法はありますか?
+ (NSArray *)arg_fromClass:(Class)clazz andArgsList:(va_list)argumentList {
NSMutableArray *arguments = [NSMutableArray new];
[arguments addObject:clazz];
id eachObject;
while ((eachObject = va_arg(argumentList, id)))
{
[arguments addObject: eachObject];
}
va_end(argumentList);
return [NSArray arrayWithArray:arguments];
}
私はそれをどのように呼びますか。私はあなたが投稿したサンプルアプリケーションを見てきました
- (void)someMethod:(Class)clazz, ... {
va_list argumentList;
va_start(argumentList, clazz);
NSArray *classesToSync = [NSArray arg_fromClass:clazz andArgsList:argumentList];
NSLog(@"Syncing Classes: %@", classesToSync);
}
おかげ
私はあなたがシミュレータ上でこれを実行しています@newacctクラッシュ – newacct
を再現することはできませんがあり、例えば、CのAPIでこれを見ることができますか?私は、クラッシュが物理的なデバイスでのみ発生することに言及することを忘れました。 – DMCApps
まだ再生できません。自己完結型のサンプルプログラムを提供してください。 – newacct