2012-04-09 10 views
1

私はObjective-C:セレクタのオブジェクトのintをidに変換する方法は?

int primaryKey = sqlite3_column_int(statement, 0); 

をフェッチSQLiteのからの戻り値を受け取ったと私はセレクタのオブジェクトとしてそれを使用するつもりです:

[[ABC alloc] performSelector:@selector(abcWithAAA:) withObject:[NSNumber numberWithInt:primaryKey]]; 

のPrimaryKeyのためのNSLog結果は数4である:

NSLog(@"primaryKey:%i",primaryKey); 
4 

[NSNumber numberWithInt:primaryKey]のNSLogの結果は131628896です。

なぜですか?どのようにしてint値を正しく変換するのですか?

ありがとうございます!

答えて

0

131628896は、NSNumberオブジェクトのメモリアドレスです。

使用:

- (void)abcWithAAA: (NSNumber *)number { 
     int primaryKey = [number intValue]; 
     NSLog("%i", primaryKey); 
} 
1

[NSNumber numberWithInt:primaryKey]を記録すると、NSNumberオブジェクトのアドレスが記録されます。中身を確認したい場合は、[[NSNumber numberWithInt:primaryKey] intValue]にする必要があります。

つまり、コンバージョンが問題であることを示唆するものは何もありません。

+0

セレクタはwithObjectのidオブジェクトとしてint型を使用することはできません。

[self performSelector:@selector(monsterTypeFromObject:) withObject:[NSNumber numberWithUnsignedInt:monsterType] afterDelay:5.0f]; 

あなたはそれがここでより詳細に説明見つけることができます。だから私はこのエラーを持って "暗黙の変換 'int'の 'ID'はARCで許可されていません" –

+0

あなたはなぜ数字が違うのか尋ねているようです。 [shrug] –

2

[NSNumber numberWithInt:primaryKey]がオブジェクトです。 オブジェクトには%@を使用してください。

NSLog(@"%@", [NSNumber numberWithInt:primaryKey]); 
+0

NSNumber * pk = [NSNumber numberWithInt:primaryKey]; NSLogの結果(@ "pk:%@"、pk);また4です。 –

+0

NSLog(@ "%d"、primaryKey); NSLog(@ "%@"、[NSNumber numberWithInt:primaryKey]);あなたに同じ出力を与えるでしょう。 –

4

問題は、withObjectメソッドのキャストを行うアダプタメソッドを使用して解決しました。 私の問題は、typedef列挙型を使用して値としてwithObjectに渡したかったということでした。

私はperformSelectメッセージ使用してこのメ​​ソッドを呼び出すと思った

typedef enum 
{ 
    MonsterTypeIWerwolf = 0, 
    MonsterTypeITempler = 1, 
    MonsterTypeIUndefined, 
} MonsterTypes; 

実際に上記のメソッドを呼び出すことができるように:あなたは、それは次のように定義されたのtypedef MonsterTypesを要求ご覧のよう

-(void) requestInfosAndPersistByMonsterType:(MonsterTypes)monsterType { 

} 

を私はそれを呼び出してこのアダプタを構築します:

-(void)monsterTypeFromObject:(id)_monsterType { 
     if ([_monsterType respondsToSelector:@selector(intValue)]) { 
      int _t = [_monsterType intValue]; 
      switch (_t) { 
       case MonsterTypeIWerwolf: 
        _t = MonsterTypeIWerwolf; 
        break; 
       case MonsterTypeITempler: 
        _t = MonsterTypeITempler; 
        break; 
       default: 
        _t = MonsterTypeIUndefined; 
        break; 
      } 
      [self requestInfosAndPersistByMonsterType:_t]; 
     } 
    } 

彼の方法: http://kerkermeister.net/objective-c-adapter-from-nsinteger-to-id-when-using-performselector-withobject/

関連する問題