SORU
3 ŞUBAT 2010, ÇARŞAMBA


Nasıl serbest @sentez için ele özelliklerini korumak mı?

Objective-C tam listesi aşağıdadır, ama temel soru şu: içinde sentezlenmiş özellikleri hakkında bazı sorularım varNasıl derleyici sentezlenmiş özellikleri için bugün ivan'ın benim kod olabilir veya dealloc yayım yöntemleri vardır olmasa bile düzgün serbest olmasını sağlamak mı?

Çok yakın akraba oldukları için tek tek soru olarak bu yazı için değil karar verdi ve soruları varolan bir avuç vardır çünkü . not: ^em>dokunungerçekten meselenin özüne girmeden bireysel konularda.

Biraz benzer sorular:


Kurulum:Tek bir özelliğe sahip bir sınıf düşünün:

@interface Person : NSObject
{
    NSString * name;
}
@property (nonatomic, retain) name;
@end

Soru #1:Çok temel bir durum

@implementation Person
@synthesize name;
@end

Bu kurulum ile, name Person bir nesne çıktığında otomatik olarak çıkacak sanırım. Aklımda, derleyici sadece kendim yazmış olsaydım dealloc yöntem [name release] ekler. Bu doğru mu?


Soru #2:Eğer bu sınıf için dealloc benim yöntemim yazmak istersem, ve [name release], sızıntı olacaktır aradım ihmal?

@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end

Soru #3:Eğer bu sınıf için dealloc benim yöntemim yazmak istersem, ve benvardır[name release], çağrı @synthesize benim için çoktan halledilir beri bir çift serbest bırakmak neden olur?

@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end

Soru #4:Eğer bu sınıf için kendi evimin emlak erişimci yazmak istersem, ama benyokdealloc benim yöntemim, name sızdırılmış olacak mı yazacaksın?

@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
    [newName retain];
    [name release];
    name = newName;
}
@end

Soru #5:Bir his var (deneyime dayalı)yokyukarıdaki senaryolar dili bunları önlemek için tasarlanmıştır beri sızıntıları ya da çift serbest bırakır, neden olur. Tabii, soru yükseltir "nasıl" mı? Derleyici sadece mümkün olan her davayı takip etmek için yeterince akıllı mı? Eğer ben olsaydım ne yapın (bu çok saçma bir örnek olduğunu unutmayın, sadece görüşümü açıklamak gerekiyordu):

void Cleanup(id object) { [object release]; }

@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end

dealloc yöntemi [name release] başka bir ekleme içine derleyici aptal?

CEVAP
3 ŞUBAT 2010, ÇARŞAMBA


S1:

Hayır. @synthesize -dealloc değiştirmez. 28 ** name Kendin yapmalısın.

S2:

Evet sızıntısı olacaktır. Aynı gerekçe olarak Q1.

S3:

-Serbest çift hayır böyle olmaz. Aynı gerekçe olarak Q1.

S4:

Evet sızıntısı olacaktır. Aynı gerekçe olarak Q1.

S5:

-Serbest çift hayır böyle olmaz. Aynı gerekçe olarak Q1.


-retain -release -dealloc ne olup bittiğini bildirmek için geçersiz kılarak, bu kendinizi kontrol edebilirsiniz.

#import <Foundation/Foundation.h>

@interface X : NSObject {}
@end
@implementation X
-(oneway void)release {
        NSLog(@"Releasing %p, next count = %d", self, [self retainCount]-1);
        [super release];
}
-(id)retain {
        NSLog(@"Retaining %p, next count = %d", self, [self retainCount] 1);
        return [super retain];
}
-(void)dealloc {
        NSLog(@"Dealloc %p", self);
        [super dealloc];
}
@end

@interface Y : NSObject {
        X* x;
}
@property (nonatomic, retain) X* x;
@end
@implementation Y
@synthesize x;
- (void)dealloc { [x release]; [super dealloc]; }
@end

int main () {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        Y* y = [[Y alloc] init];
        X* x = [[X alloc] init];
        y.x = x;
        [y release];
        [x release];
        [pool drain];                                                    
        return 0;
}

İçinde Q1, Q2 ve Q4, son -retainCount x 1, böylece bir sızıntı, Q3 ve Q5 son -retainCount 0 ve -dealloc denir, bu yüzden hiçbir sızıntı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canal de arkyoru

    Canal de ark

    18 Ocak 2007
  • DavideoDesign

    DavideoDesig

    24 NİSAN 2006
  • vgeller1

    vgeller1

    22 Kasım 2009