Şimdi Ara

Objective-C(Cocoa) dealloc sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
0
Favori
584
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • myInstance diye bir instance var, sahibi de myClass denen class.
    myClass'ın 'dealloc' metodunu implementation içerisinde override edip

    -(void) dealloc
    {
    [myInstance release];
    [super dealloc];
    }

    diyorum ama ARC iki satıra da hata veriyor yemen 'ARC forbids explicit message send of release/dealloc' diye..
    Ne ayak anlamadım..

    ikinci bir sorun da autorelease

    bir instance allocate ediyorum başkasına vermek için, vermeden hemen önce autorelease gonderiyorum alloc ettiğim arkadaşa, buna da şarlıyor ARC hemen aynı şekil bir uyarıyla..



  • Burada biraz Cocoa'nın referance counting dediği olayı karıştırmışsın. Özet olarak release / retain ne işe yarar dersek:

    Retain: Bir objenin referans sayısını 1 arttırır.
    Release: Bir objenin referans sayısını 1 azaltır.

    Nedir bu referans dediğimiz şeyler? Herhangi bir class, bizim myInstance objesinde gözü varsa bu objeyi retain eder. Örnek; HerhangiClass* hC = [myInstance Retain] gibi. Böylelikle objenin "life cycle" ı bu class üzerindede devam eder.
    (Not burda HerHangiClass* (id) ye karşılık geliyor Objective c de.)

    Referans sayısını azaltmakta aynı mantıktır. Ben bu objeyi daha kullanmayacağım burda dersin ve [myInstance release] edersin.

    Her objenin bir "referance count" denilen integer counterı vardır. Bir object yaratıldığında ( new veya alloc ile ), bu counter = 1 olarak set olur. Retain dediğin zaman bu counter + 1 olarak arttırılır.

    Son olarak soruna gelirsek:

    Her [myInstance release] dediğinde myInstance ın referans counter ı 1 azalır. En son objenin referance counter ı sıfıra geldiğinde dealloc methodu çağırılır. Yani senin dealloc un içinde [myInstance release] i çağırman bir hata. myInstance ı başka bir Class içinde kullanıyorsan ( new, alloc, retain gibi. ) o classın deallocu içinde [myInstance release] demen lazım.

    Umarım yardımcı olmuşumdur.



    < Bu mesaj bu kişi tarafından değiştirildi leventg -- 16 Kasım 2011; 13:07:10 >




  • Ikıncı soruyuda şöyle çözmeye çalışabilirsin:

    MyObject *mo = [[[MyObject alloc] init] autorelease] retain];

    Bu objeyi sonra kullandığın diğer class da release etmen lazım. Bir önceki soruda söylediğim gibi.
  • quote:

    Orijinalden alıntı: leventg

    Burada biraz Cocoa'nın referance counting dediği olayı karıştırmışsın. Özet olarak release / retain ne işe yarar dersek:

    Retain: Bir objenin referans sayısını 1 arttırır.
    Release: Bir objenin referans sayısını 1 azaltır.

    Nedir bu referans dediğimiz şeyler? Herhangi bir class, bizim myInstance objesinde gözü varsa bu objeyi retain eder. Örnek; HerhangiClass* hC = [myInstance Retain] gibi. Böylelikle objenin "life cycle" ı bu class üzerindede devam eder.
    (Not burda HerHangiClass* (id) ye karşılık geliyor Objective c de.)

    Referans sayısını azaltmakta aynı mantıktır. Ben bu objeyi daha kullanmayacağım burda dersin ve [myInstance release] edersin.

    Her objenin bir "referance count" denilen integer counterı vardır. Bir object yaratıldığında ( new veya alloc ile ), bu counter = 1 olarak set olur. Retain dediğin zaman bu counter + 1 olarak arttırılır.

    Son olarak soruna gelirsek:

    Her [myInstance release] dediğinde myInstance ın referans counter ı 1 azalır. En son objenin referance counter ı sıfıra geldiğinde dealloc methodu çağırılır. Yani senin dealloc un içinde [myInstance release] i çağırman bir hata. myInstance ı başka bir Class içinde kullanıyorsan ( new, alloc, retain gibi. ) o classın deallocu içinde [myInstance release] demen lazım.

    Umarım yardımcı olmuşumdur.

    Çok teşekkürler cevap için..

    Yalnız ben zaten myInstance'ı onun sahibi olan Class içerisinde release ediyorum. Sahibi olan derken o instance'ı oluşturan ve ona pointer olan koddan release etmeye çalışıyorum.. myInstance'ın kendi içerisinden değil.. ona rağmen laf ediyor..

    Yani myViewController var örneğin.. bir de myModel var.. myViewController'da myModel'ı alloc-init ettim.. ve myViewController'ın dealloc'unu override edip önce myModel'a release, sonra da super release gondermeye çalışıyorum olmuyor.. Bunun olması lazım değil mi.. Siz de zaten bu şekil söylemişssiniz.. Yanlış mı anladım..




  • quote:

    Orijinalden alıntı: leventg

    Ikıncı soruyuda şöyle çözmeye çalışabilirsin:

    MyObject *mo = [[[MyObject alloc] init] autorelease] retain];

    Bu objeyi sonra kullandığın diğer class da release etmen lazım. Bir önceki soruda söylediğim gibi.

    Bunu da anlayamadımvar.. niye hem autorelease hem retain gönderiyorsunuz...

    Diyelim ben objeyi birine vereceğim ama verdikten sonra kurtulmak istiyorum. release gönderirsem veremeden obje uçmuş olur.. o yüzden autorelease gönderiyorum ki benim sorumluluğumdan çıksın, objeyi başkası retain edene kadar ortalıkta kalsın, retain edilmezse de dealloc olsun..Eğer autorelease gönderdikten sonra yine aynı satırda retain gönderirsem objenin sorumluluğunu yine üzerime almış oluyorum.. kurtulamıyorum yani.. Oyle değil mi..


    Tekrar teşekkürler cevabınız için.. Obj-C'ye cevap veren az bulunuyor..




  • quote:

    Orijinalden alıntı: Noahian

    quote:

    Orijinalden alıntı: leventg

    Burada biraz Cocoa'nın referance counting dediği olayı karıştırmışsın. Özet olarak release / retain ne işe yarar dersek:

    Retain: Bir objenin referans sayısını 1 arttırır.
    Release: Bir objenin referans sayısını 1 azaltır.

    Nedir bu referans dediğimiz şeyler? Herhangi bir class, bizim myInstance objesinde gözü varsa bu objeyi retain eder. Örnek; HerhangiClass* hC = [myInstance Retain] gibi. Böylelikle objenin "life cycle" ı bu class üzerindede devam eder.
    (Not burda HerHangiClass* (id) ye karşılık geliyor Objective c de.)

    Referans sayısını azaltmakta aynı mantıktır. Ben bu objeyi daha kullanmayacağım burda dersin ve [myInstance release] edersin.

    Her objenin bir "referance count" denilen integer counterı vardır. Bir object yaratıldığında ( new veya alloc ile ), bu counter = 1 olarak set olur. Retain dediğin zaman bu counter + 1 olarak arttırılır.

    Son olarak soruna gelirsek:

    Her [myInstance release] dediğinde myInstance ın referans counter ı 1 azalır. En son objenin referance counter ı sıfıra geldiğinde dealloc methodu çağırılır. Yani senin dealloc un içinde [myInstance release] i çağırman bir hata. myInstance ı başka bir Class içinde kullanıyorsan ( new, alloc, retain gibi. ) o classın deallocu içinde [myInstance release] demen lazım.

    Umarım yardımcı olmuşumdur.

    Çok teşekkürler cevap için..

    Yalnız ben zaten myInstance'ı onun sahibi olan Class içerisinde release ediyorum. Sahibi olan derken o instance'ı oluşturan ve ona pointer olan koddan release etmeye çalışıyorum.. myInstance'ın kendi içerisinden değil.. ona rağmen laf ediyor..

    Yani myViewController var örneğin.. bir de myModel var.. myViewController'da myModel'ı alloc-init ettim.. ve myViewController'ın dealloc'unu override edip önce myModel'a release, sonra da super release gondermeye çalışıyorum olmuyor.. Bunun olması lazım değil mi.. Siz de zaten bu şekil söylemişssiniz.. Yanlış mı anladım..



    Sorunu zaten compiler söylüyormuş aslında;

    ARC = Automatic Reference Counting

    Xcode 4.2 ile gelen bir özellik. Release / Retain etmenize izin vermiyor. Kod ile ilgili bir sıkıntı yok yani, Xcode IDE sinden kaynaklanan bir sorun olmuş.

    Şurada çözümü bulunmakta:

    http://stackoverflow.com/questions/7164848/arc-error-when-compiling
    http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk/6368692#6368692

    Edit: Kod ile sıkıntı yok derken eski sisteme göre bir sıkıntı yok, yeni gelen sisteme göre değiştirmeniz lazım tabi.



    < Bu mesaj bu kişi tarafından değiştirildi leventg -- 16 Kasım 2011; 23:00:07 >




  • quote:

    Orijinalden alıntı: Noahian

    quote:

    Orijinalden alıntı: leventg

    Ikıncı soruyuda şöyle çözmeye çalışabilirsin:

    MyObject *mo = [[[MyObject alloc] init] autorelease] retain];

    Bu objeyi sonra kullandığın diğer class da release etmen lazım. Bir önceki soruda söylediğim gibi.

    Bunu da anlayamadımvar.. niye hem autorelease hem retain gönderiyorsunuz...

    Diyelim ben objeyi birine vereceğim ama verdikten sonra kurtulmak istiyorum. release gönderirsem veremeden obje uçmuş olur.. o yüzden autorelease gönderiyorum ki benim sorumluluğumdan çıksın, objeyi başkası retain edene kadar ortalıkta kalsın, retain edilmezse de dealloc olsun..Eğer autorelease gönderdikten sonra yine aynı satırda retain gönderirsem objenin sorumluluğunu yine üzerime almış oluyorum.. kurtulamıyorum yani.. Oyle değil mi..


    Tekrar teşekkürler cevabınız için.. Obj-C'ye cevap veren az bulunuyor..


    Burda aslında ben yanlış kodla anlatmışım demek istediğimi. autorelease ve retain yanyana pek bir mantığı yok gerçekten. autorelease kısmını başka bir class da, retain kısmınıda başka class da yaptığınızı düşünmek istemiştim. Örnek:

    //Class A

    MyObject *mo;

    (*mo) method{

    mo = [[[MyObject alloc] init] autorelease];
    .....
    ..
    .

    return mo;
    }

    // Class B

    MyObject *mo = [[classA method] retain];

    Böyle bir durumu kastetmiştim ben ama sizin sorununuz gene Xcode 4.2 den kaynaklanıyor olabilir. Ben en son 4.1 de kalmıştım bu ARC özellikleri falan yeni gelmiş herhalde, paslanmışız.




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • quote:

    Orijinalden alıntı: leventg

    quote:

    Orijinalden alıntı: Noahian

    quote:

    Orijinalden alıntı: leventg

    Burada biraz Cocoa'nın referance counting dediği olayı karıştırmışsın. Özet olarak release / retain ne işe yarar dersek:

    Retain: Bir objenin referans sayısını 1 arttırır.
    Release: Bir objenin referans sayısını 1 azaltır.

    Nedir bu referans dediğimiz şeyler? Herhangi bir class, bizim myInstance objesinde gözü varsa bu objeyi retain eder. Örnek; HerhangiClass* hC = [myInstance Retain] gibi. Böylelikle objenin "life cycle" ı bu class üzerindede devam eder.
    (Not burda HerHangiClass* (id) ye karşılık geliyor Objective c de.)

    Referans sayısını azaltmakta aynı mantıktır. Ben bu objeyi daha kullanmayacağım burda dersin ve [myInstance release] edersin.

    Her objenin bir "referance count" denilen integer counterı vardır. Bir object yaratıldığında ( new veya alloc ile ), bu counter = 1 olarak set olur. Retain dediğin zaman bu counter + 1 olarak arttırılır.

    Son olarak soruna gelirsek:

    Her [myInstance release] dediğinde myInstance ın referans counter ı 1 azalır. En son objenin referance counter ı sıfıra geldiğinde dealloc methodu çağırılır. Yani senin dealloc un içinde [myInstance release] i çağırman bir hata. myInstance ı başka bir Class içinde kullanıyorsan ( new, alloc, retain gibi. ) o classın deallocu içinde [myInstance release] demen lazım.

    Umarım yardımcı olmuşumdur.

    Çok teşekkürler cevap için..

    Yalnız ben zaten myInstance'ı onun sahibi olan Class içerisinde release ediyorum. Sahibi olan derken o instance'ı oluşturan ve ona pointer olan koddan release etmeye çalışıyorum.. myInstance'ın kendi içerisinden değil.. ona rağmen laf ediyor..

    Yani myViewController var örneğin.. bir de myModel var.. myViewController'da myModel'ı alloc-init ettim.. ve myViewController'ın dealloc'unu override edip önce myModel'a release, sonra da super release gondermeye çalışıyorum olmuyor.. Bunun olması lazım değil mi.. Siz de zaten bu şekil söylemişssiniz.. Yanlış mı anladım..



    Sorunu zaten compiler söylüyormuş aslında;

    ARC = Automatic Reference Counting

    Xcode 4.2 ile gelen bir özellik. Release / Retain etmenize izin vermiyor. Kod ile ilgili bir sıkıntı yok yani, Xcode IDE sinden kaynaklanan bir sorun olmuş.

    Şurada çözümü bulunmakta:

    http://stackoverflow.com/questions/7164848/arc-error-when-compiling
    http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk/6368692#6368692

    Edit: Kod ile sıkıntı yok derken eski sisteme göre bir sıkıntı yok, yeni gelen sisteme göre değiştirmeniz lazım tabi.

    Hocam budur. İki problem de bundan kaynaklanıyormuş.. Çok teşekkür ediyorum..



    Not: Soyadınız 'Güren' değilse bu notumu yok sayın. Eğer öyle ise özelden bir söylerseniz sevinirim. Düşük ihtimal ama Levent Güren diye bir tanıdığım vardı çok eskiden bilgisayarla ilgilenen..




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.