/ / Objc Cocoa MRC - Освободените и авторегулирани обекти трябва да го напиша, за да видите приложението - object-c, metal

Objc Cocoa MRC - Издавани и авторелейни обектиАрябва да го напиша, за да видя приложение - цел-c, метал

Аз пиша C ++ приложение, използвайки Metal API(цел С) и MRC (преброяване на ръчно задание). Имам много ограничен опит с ObjC. Повечето от металните API обекти се дефинират като протоколи и се създават като обект, върнат от C-функцията или от друг метод на обекта (напр. MTLDevice newBufferWithLength). настройка autoreleased или не (не мога да се обадя освобождаване на autoreleased обект с запазване брой 1 например). Проблемът е, че не мога да намеря никакво описание в документацията на Metal API, което би отговорило на този въпрос. Аз само четах в ръководството за потребителя, че всички така наречени леки обекти се създават автоматично. Съществуват три примера за обекти, които не се използват автоматично, но не съм сигурен дали мога просто да предположа, че останалите обекти не са автоматично освободени. В какаото много обекти могат да бъдат създадени и без alloc + init, които се връщат от статичен метод (exnString string), така че проблемът не изглежда само метален.

Благодаря ти за помощта.

Отговори:

2 за отговор № 1

Обичайното правило Objective-C е създаването на обхватсъщо е отговорен за освобождаване на обект. Така че, на практика във всички случаи, с изключение на добре документирани изключения, върнатият обект се изтрива автоматично (и двете се връщат чрез връщаната стойност или външни аргументи). По-правилен начин да го видите е, че обектът винаги се връща с +0 обхват-локално запазване на броя, така че от вас се очаква да я запазите, ако е необходимо. Четене на ръководството изглежда, че Metal API е една от рамките на Apple, така че трябва да следва това правило, освен ако не е предупредено с удебелени изявления. и функция по отношение на управлението на ресурсите.)

За това "alloc-init vs. [NSString string] "част: MRC код или връща [NSString string], който вече е +0, или [[NSString alloc] init] авторелиз]. В противен случай се нарушава конвенцията. -[init] и +[new...] самите методи, които връщат +1. При ARC няма разлика между alloc-init / string, защото ARC познава конвенцията и прави правилното нещо, като оптимизира прекомерните задържания / освобождавания, където е възможно.

Също така имайте предвид, че -[retainCount] е безсмислено и "смятано за вредно", защото никога не знаете колко са били извършени повиквания за запазване на авто-освобождаване и какво счетоводство на objc-runtime е в сила дори с вашите собствени обекти.

ARC наистина е чудесна възможност, освен ако не степисане на някакъв вид Objective-C-to- Какъвто и да е мост, където запазването на броя и / или цикъла трябва да се управлява изрично поради липса на контекст. Това не отнема нищо от вас, като в повечето случаи дава голямо предимство да не управлявате ресурсите изобщо.