2009-05-18 15 views
5

Biorąc pod uwagę następującą definicję klasy z zachowują właściwości:Dlaczego ta właściwość wymaga "zachowywania"?

@interface FeedEntry : NSObject<NSCoding> 
{ 
    NSURL* url; 
    NSData* source; 
} 

@property (retain) NSURL* url; 
@property (retain) NSData* source; 
@end 

@implementation FeedEntry 

@synthesize url; 
@synthesize source; 

-(void)encodeWithCoder:(NSCoder*)coder 
{ 
    [coder encodeObject:url  forKey:@"url"]; 
    [coder encodeObject:source forKey:@"source"]; 
} 

Dlaczego właściwość url w metodzie initWithCoder potrzebne „zachować”:

-(id)initWithCoder:(NSCoder*)coder 
{ 
    url = [[coder decodeObjectForKey:@"url"] retain]; 
    source = [coder decodeObjectForKey:@"source"]; 

    NSLog(@"got url=%@\n", url); 
    return self; 
} 

szczególności, dlaczego nie zsyntetyzowany " get url "metoda zatrzymania obiektu? (Domyślam się, że właściwość źródłowa również będzie wymagać zachowania).

Odpowiedz

16

Szybka odpowiedź:

Po ustawieniu:

url = [[coder decodeObjectForKey:@"url"] retain]; 

jesteś nie pomocą @property. Ręczne ustawienie wartości zmiennej instancji url. Dlatego też musisz ręcznie ustawić wartość.

Aby ustawić zmienną używając syntetyzowane właściwości, byś zamiast zadzwonić:

[self setUrl:[coder decodeObjectForKey:@"url"]]; 

lub

self.url = [coder decodeObjectForKey:@"url"]; 

Każda z tych form będzie skorzystać z syntetyzowanych metodami i obsługiwać retain automatycznie .

Szczegóły:

W Objective-C, @property i @synthesize wyszukiwane automatycznie utworzyć metody getter i setter dla Ciebie:

@interface MyClass 
{ 
    id someValue; 
} 
@property (retain) id someValue; 
@end 

@implementation MyClass 
@synthesize someValue; 
@end 

jest równoznaczne z:

@interface MyClass 
{ 
    id someValue; 
} 
- (id)someValue; 
- (void)setSomeValue:(id)newValue; 
@end 

@implementation MyClass 
- (id)someValue { return someValue; } 
- (void)setSomeValue:(id)newValue 
{ 
    [newValue retain]; 
    [someValue release]; 
    someValue = newValue; 
} 
@end 

Stwarza to ważną różnicę między "wewnętrzną" zmienną składową i właściwość o tej samej nazwie. Jeśli odwołujesz się do zmiennej składowej po nazwie, omijasz syntezowane metody właściwości.

+0

Rzeczywiście! Mam wrażenie, że to dość często mnie gryzie. Dzięki za odpowiedź. – Justicle

+0

Moja przyjemność. Na początku trzeba się przyzwyczaić. Gdy robisz to od jakiegoś czasu, staje się on drugą naturą :) –

+4

To jeden z powodów, dla których lubię używać przedrostka _ na zmiennych prywatnych instancji, bardzo łatwo jest określić, kiedy używasz zmiennej instancji vs cokolwiek innego. –

Powiązane problemy