2013-08-20 26 views
5

Znalazłem podobne pytania, ale -containsObject nie działa tak, jak oczekuję.NSMutableArray zawieraObject zwraca true, ale nie powinno

Mój problem polega na tym, że metoda NSMutableArray -containsObject zwraca wartość true, gdy nie powinna, podczas próby wygenerowania losowych UNIKALNYCH kolorów i dodania do tablicy.

Jaki jest najlepszy sposób sprawdzenia, czy NSMutableArray zawiera obiekt o tych samych wartościach.

NSMutableArray *color_arr=[NSMutableArray array]; 
UIColor *t; 
for(int i=0; i<100; i+=1) 
{ 
    int r = arc4random()%256; 
    int g = arc4random()%256; 
    int b = arc4random()%256; 

    t=[UIColor colorWithRed:r green:g blue:b alpha:255]; 

    if (![color_arr containsObject:t]) 
    [color_arr addObject:t]; 

    //[t release];//is t need to be released here on non-arc project? well Im not sure. 
} 
NSLog(@"total:%d",[color_arr count]); 


NSLog() zawsze mówi count tablica jest 1.

+1

Czy debugowania, aby prześledzić i spojrzeć na 't' i zawartości' colour_arr'? – Wain

+0

(UIColor *) t otrzymuje różne wartości adresu i rgb, tak jak powinien. , ale zawieraObject mówi: hej "Już to mam". po prostu kopiuj i wklej kod. i uzyskać liczbę rejestrów 1 –

+3

UIColor przyjmuje zmienne (CGFloats to be precise) jako wartości RGB - od 0 do 1. Prawdopodobnie stworzyłeś długą serię identycznych obiektów przez nasycenie wartości RGB. – Monolo

Odpowiedz

4

Nowa Edycja:

Struktura swojej pętli for() jest źle zbyt. Deklarujesz UIColor przed rozpoczęciem pętli. Powinieneś być oświadczając koloru po rozpoczęciu pętla:

for (i=0;i<100;i++) { 
    int rInt = arc4random()%256; 
    float rFloat = (float)rInt/255.0f; 
    //same with gInt, bInt 
    //make gFloat and bFloat this way 
    UIColor *t = [UIColor colorWithRed:rFloat green:gFloat blue:bFloat alpha:1]; 
    if (![color_arr containsObject:t]) { 
     [color_arr addObject:t]; 
    } 
    NSLog(@"%i",color_arr.count); 
} 

UIColor nie używa integer wartości, używa float wartości. Spróbuj podzielić swój integer przez 255, a następnie ustawić jako r, g, b.

odczuwalna:

int rInt = arc4random()%256; 
float rFloat = (float)rInt/255.0f; 
//same with gInt, bInt 
//make gFloat and bFloat this way 
t = [UIColor colorWithRed:rFloat green:gFloat blue:bFloat alpha:1]; 
+0

Prawdopodobnie chcesz ustaw wartość alfa na 1.0. – Monolo