2013-08-20 30 views
5

Tôi đã tìm thấy các câu hỏi tương tự, nhưng -containsObject không hoạt động như tôi mong đợi.NSMutableArray containsObject trả về true, nhưng nó không nên

Vấn đề của tôi là phương pháp NSMutableArray -containsObject trả về true khi không nên, khi cố gắng tạo ra các màu UNIQUE ngẫu nhiên và thêm vào một mảng.

Cách tốt nhất để kiểm tra xem NSMutableArray có chứa đối tượng có cùng giá trị hay không.

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]); 


Các NSLog() luôn nói đếm mảng là 1.

+1

Cậu gỡ lỗi để bước qua và nhìn vào 't' và các nội dung của 'colour_arr'? – Wain

+0

(UIColor *) t nhận địa chỉ và giá trị rgb khác nhau. nhưng chứaObject nói "Tôi đã hiểu rồi." chỉ cần dán mã sao chép. và nhận được số lượng log 1 –

+3

UIColor lấy nổi (CGFloats chính xác) như giá trị RGB - giữa 0 và 1. Bạn có thể đã tạo ra một loạt các đối tượng giống hệt nhau bằng cách bão hòa các giá trị RGB. – Monolo

Trả lời

4

New Edit:

Cấu trúc của for() vòng lặp của bạn là sai quá. Bạn đang khai báo UIColor trước khi vòng lặp bắt đầu. Bạn nên khai báo màu SAU vòng lặp bắt đầu:

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 không sử dụng integer giá trị, nó sử dụng float giá trị. Hãy thử chia integer của bạn cho 255 và sau đó thiết lập những người đó là r, g, b.

Giống như:

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

Bạn có thể muốn cũng đặt giá trị alpha thành 1.0. – Monolo

Các vấn đề liên quan