วิธีเผยแพร่ CGColorRef

ฉันมีวิธีที่ส่งคืนอินสแตนซ์ CGColorRef ที่สร้างโดยวิธี CGColorCreate ฉันต้องปล่อยสีที่ส่งคืนโดยอัตโนมัติจากวิธีนี้ ไม่มีใครรู้วิธีการทำเช่นนี้?

//red,green,blue are from 0-255 range

+(CGColorRef) getColorFromRed:(int)red Green:(int)green Blue:(int)blue Alpha:(int)alpha
{
    CGFloat r = (CGFloat) red/255.0;
    CGFloat g = (CGFloat) green/255.0;
    CGFloat b = (CGFloat) blue/255.0;
    CGFloat a = (CGFloat) alpha/255.0;  
    CGFloat components[4] = {r,g,b,a};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef color = CGColorCreate(colorSpace, components);
    CGColorSpaceRelease(colorSpace);

    //CGColorRelease(color);
    // I need to auto release the color before returning from this.

    return color;
}

person Charith Nidarsha    schedule 17.08.2010    source แหล่งที่มา
comment
อวดรู้: ควรตั้งชื่อเมธอดที่ขึ้นต้นด้วย get เท่านั้น หากใช้พอยน์เตอร์ที่ต้องกรอกข้อมูลเป็นอาร์กิวเมนต์ ชื่อที่ดีกว่าในที่นี้คือ + (CGColorRef)CGColorWithRed:(int)red green:(int)green blue:(int)blue alpha:(int)alpha (ตามหลังผู้นำของเมธอด NSColor/UIColor)   -  person Wevah    schedule 17.08.2010


คำตอบ (4)


คุณไม่สามารถโดยตรงตามที่ mvds กล่าว นอกจากนี้ UIColor และ CGColorRef ยัง ไม่ เชื่อมโยงแบบไม่ต้องใช้เครื่องมือ -- เหตุใดตัวแปลงจึงทำงาน อย่างไรก็ตาม (และถึงแม้ ฉันไม่แนะนำ แต่ให้ใช้ UIColor แทน!) มีเคล็ดลับให้ทำดังนี้:

สร้างวัตถุ UIColor เผยแพร่อัตโนมัติ และส่งคืนเป็น CGColor ชอบเช่นนั้น:

return [UIColor colorWith... ].CGColor;

สิ่งนี้จะส่งคืนอ็อบเจ็กต์ CGColorRef ปกติที่ถูกผูกไว้กับมันคือ UIColor ซึ่งหมายความว่าหาก UIColor ถูกปล่อยในลูป autorelease นั้น CGColorRef ก็จะถูกปล่อยออกมาเช่นกัน เว้นแต่จะถูกเก็บไว้ที่อื่นโดยใช้ CGRetain(...) ซึ่งผู้เรียกวิธีการของคุณควรดำเนินการหากต้องการเก็บสีไว้ ด้วยเหตุนี้ CGColorRef จึงเป็นการหลอกอัตโนมัติ...

อย่างไรก็ตาม: ฉัน ไม่ แนะนำให้ทำเช่นนั้น ใช้ UIColor โดยตรง!

person Max Seelemann    schedule 17.08.2010
comment
แม้ว่าฉันต้องยอมรับว่านี่ค่อนข้างชาญฉลาด แต่ก็มีข้อบกพร่อง (โอกาส) ที่แทบจะเป็นไปไม่ได้ที่จะพบในโค้ดของคุณเองในอีก 6 เดือนนับจากนี้ - person mvds; 18.08.2010

คุณสามารถทำได้:

CGColorRef color = (CGColorRef)[(id)CGColorCreate(colorSpace, components) autorelease];
person Alex Kantaev    schedule 17.08.2010

คุณไม่สามารถ. พูลการเผยแพร่อัตโนมัติทำงานกับอ็อบเจ็กต์ที่ฟังข้อความ release และ CGColorRef ไม่ใช่อ็อบเจ็กต์ดังกล่าว

คุณสามารถเขียนสิ่งต่าง ๆ เพื่อส่งคืน UIColor ได้โดยทำ

UIColor *ret = [UIColor colorWithCGColor:color]; // ret will be autoreleased
CGColorRelease(color);
return ret;
person mvds    schedule 17.08.2010
comment
ในโปรแกรม Cocoa CGColorRef คืออ็อบเจ็กต์ Cocoa ที่ใช้โปรโตคอล NSObject จะปลอดภัยอย่างยิ่งที่จะใส่ไว้ในพูลการเผยแพร่อัตโนมัติ - person Jay Lieske; 21.12.2011
comment
ฟังดูน่าสนใจ. คุณมีตัวชี้ไปยังเอกสารสนับสนุนเรื่องนี้หรือไม่? - person mvds; 21.12.2011

ใช้สะพานโทรฟรี:

return [(UIColor *)color autorelease];

หรือคุณสามารถใช้วิธี + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha แล้วทำ return [myColor CGColor];

person beefon    schedule 17.08.2010
comment
UIColor และ CGColorRef ไม่ได้รับการบันทึกไว้ว่าสามารถเชื่อมต่อแบบโทรฟรีได้ คุณสามารถใช้ +colorWithCGColor: เพื่อแปลงเป็น UIColor ได้ - person JeremyP; 17.08.2010