2009-05-18 24 views
5

korumak özelliklere sahip bir sınıfın şu tanımı göz önüne alındığında: Bu mülk neden 'korumaya' ihtiyaç duyuyor?

@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"]; 
} 

Neden "korumak" initWithCoder yönteminde url özelliği ihtiyacı var:

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

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

Özellikle, neden sentezlenmiş yok " url "yöntemi nesneyi korumak? (Sanırım kaynak özelliği de bir muhafazaya ihtiyaç duyacaktır).

cevap

16

Hızlı cevap:

ayarladığınız:

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

Eğer @property kullanarak değil bulunmaktadır. url örnek değişkeninin değerini manuel olarak ayarlıyorsunuz. Bu nedenle, el ile de retain değerini almalısınız.

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

veya

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

bu formların Ya

sentezlenmiş yöntemlerin kullanılmasına yapacak ve otomatik retain kolu:

sentezlenmiş özelliklerini kullanarak değişkeni ayarlamak için, bunun yerine çağırır .

Detayları: yılında

Objective-C, @property ve @synthesize anahtar sizin için otomatik olarak alıcı ve ayarlayıcı yöntemleri oluşturmak:

@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 

:

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

@implementation MyClass 
@synthesize someValue; 
@end 

denk mi Bu, "iç" üye değişkeni ile aynı ada sahip mülk. Üye değişkenine isme göre başvurursanız, sentezlenen özellik yöntemlerini atlarsınız.

+0

Gerçekten de! Bunun beni oldukça sık ısırdığını hissediyorum. Cevabın için teşekkürler. – Justicle

+0

Benim için zevk. İlk başta alışmak biraz zaman alır. Bir süredir bunu yaptığınızda, ikinci doğa haline gelir :) –

+4

Özel örnek değişkenlerde _ ön ekini kullanmaktan hoşlandığım nedenlerden biri, bir örnek değişken kullandığınızda bunu söylemeyi çok kolaylaştırır vs başka bir şey. –

İlgili konular