Cara melepaskan secara otomatis CGColorRef

Saya memiliki metode yang mengembalikan instance CGColorRef yang dibuat dengan metode CGColorCreate. Saya perlu melepaskan pengembalian warna secara otomatis dari metode ini. Adakah yang tahu cara melakukan ini?

//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 sumber
comment
Pedantic: Seseorang hanya boleh memberi nama metode yang dimulai dengan get jika diperlukan pointer yang harus diisi sebagai argumen. Nama yang lebih baik di sini adalah + (CGColorRef)CGColorWithRed:(int)red green:(int)green blue:(int)blue alpha:(int)alpha (mengikuti metode NSColor/UIColor).   -  person Wevah    schedule 17.08.2010


Jawaban (4)


Anda tidak bisa secara langsung, seperti yang dikatakan mvds. Juga UIColor dan CGColorRef tidak dijembatani tanpa alat -- lalu mengapa konverter berfungsi? Namun (dan meskipun Saya tidak merekomendasikan -- gunakan UIColor sebagai gantinya!) ada trik untuk melakukannya:

Buat objek UIColor autoreleased dan kembalikan CGColor-nya. Seperti:

return [UIColor colorWith... ].CGColor;

Ini akan mengembalikan objek CGColorRef biasa yang terikat pada UIColor-nya. Artinya, jika UIColor dilepaskan dalam perulangan autorelease, CGColorRef-nya juga akan dilepaskan -- kecuali UIColor telah disimpan di tempat lain menggunakan CGRetain(...), yang seharusnya dilakukan oleh pemanggil metode Anda jika ingin mempertahankan warnanya. Dengan demikian CGColorRef adalah pseudo-autoreleased...

Namun: Saya tidak merekomendasikan hal tersebut. Gunakan UIColor secara langsung!

person Max Seelemann    schedule 17.08.2010
comment
Meskipun harus saya akui bahwa ini cukup cerdik, hal ini menimbulkan (kemungkinan) bug yang hampir tidak mungkin ditemukan dalam kode Anda sendiri 6 bulan dari sekarang. - person mvds; 18.08.2010

Kamu bisa melakukan ini:

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

Kamu tidak bisa. Kumpulan rilis otomatis berfungsi pada objek yang mendengarkan pesan release, dan CGColorRef bukanlah objek tersebut.

Anda dapat menulis ulang sesuatu untuk mengembalikan UIColor, dengan melakukan

UIColor *ret = [UIColor colorWithCGColor:color]; // ret will be autoreleased
CGColorRelease(color);
return ret;
person mvds    schedule 17.08.2010
comment
Dalam program Kakao, CGColorRef adalah objek Kakao yang mengimplementasikan protokol NSObject. Sangat aman untuk menempatkannya di kumpulan rilis otomatis. - person Jay Lieske; 21.12.2011
comment
Kedengarannya menarik. Apakah Anda memiliki petunjuk ke dokumentasi yang mendukung hal ini? - person mvds; 21.12.2011

Gunakan jembatan bebas pulsa:

return [(UIColor *)color autorelease];

Atau Anda dapat menggunakan metode + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha dan kemudian melakukan return [myColor CGColor];

person beefon    schedule 17.08.2010
comment
UIColor dan CGColorRef tidak didokumentasikan sebagai jembatan bebas pulsa. Anda dapat menggunakan +colorWithCGColor: untuk mengonversi ke UIColor. - person JeremyP; 17.08.2010