.H ve .m dosyasındaki @interface tanımı arasındaki fark


81

Normalde kullanırız

@interface interface_name : parent_class <delegates>
{
......
}
@end 

yöntemi .h dosyasında ve .m dosyasında .h dosyasında bildirilen değişkenlerin özelliklerini sentezliyoruz.

Ancak bazı kodlarda bu @interface ..... @ end yöntemi .m dosyasında da tutulur. Bunun anlamı ne? Onların arasındaki fark ne?

.M dosyasında tanımlanan arayüz dosyası için alıcılar ve ayarlayıcılar hakkında da birkaç söz veriniz ...

Şimdiden teşekkürler

Yanıtlar:


63

@interfaceÖzel yöntemler içeren bir kategoriyi tanımlayan bir ek koymak yaygındır :

Kişi.h:

@interface Person
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end

Kişi. M:

@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.

-(void)startThinkOfWhatToHaveForDinner;
@end


@implementation Person

@synthesize name = _name;

-(NSString*)makeSmallTalkWith:(Person*)person
{
    [self startThinkOfWhatToHaveForDinner];
    return @"How's your day?";
}


-(void)startThinkOfWhatToHaveForDinner
{

}

@end

'Özel kategori' (isimsiz bir kategori için uygun isim 'özel kategori' değildir, 'sınıf uzantısı'dır). M derleyicinin yöntemlerin tanımlandığına dair uyarı vermesini engeller. Ancak, @interface.m dosyasındaki bir kategori olduğundan, içinde ivars tanımlayamazsınız.

6 Ağustos 2012 Güncellemesi: Objective-C, bu cevabın yazıldığından bu yana gelişti:

  • ivars bir sınıf uzantısında bildirilebilir (ve her zaman olabilir - cevap yanlıştı)
  • @synthesize gerekli değil
  • ivarsartık şunun üstündeki parantez içinde belirtilebilir @implementation:

yani,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end

4
Küçük not, özel arabirimi bildirirken parantez içine hiçbir şey koymayın. Aksi takdirde, sadece bir kategori yaratır ve bunu istemezsiniz. @interface Person ()yeterli olacaktır.
Itai Ferber

Teşekkürler itaiferber, bunu fark etmemiştim. Cevabımı güncelledim.
Benedict Cohen

4
İnsanlar kategoriler hakkında daha fazla bilgi edinmek istiyorsa, bu sayfa benim için çok faydalı oldu.
Tim

1
Parantez içinde hiçbir şey yoksa, bu aslında a class extensiondeğil acategory
Paul olarak

5
@ dev91 Bu yanıt oldukça eski ve derleyici ilk yazıldığından beri büyük ölçüde gelişti. Yöntem gövdesi 'görünür' ise, derleyicinin artık bir yöntem için bir bildirime ihtiyacı yoktur. Bu, sınıf devamlarının ( @interface className ()) genel olarak artık yalnızca özel @propertyURL'leri içereceği anlamına gelir .
Benedict Cohen

10

Buradaki konsept, .h'yi sınıfınızın genel arabirimleriyle sınırlarsanız ve ardından bu sınıf uzantısına özel uygulama ayrıntılarını koyarsanız projenizi daha temiz hale getirebilmenizdir.

ABC.h dosyasında değişken yöntemlerini veya özelliklerini bildirdiğinizde, bu değişkenlerin özelliklerine ve yöntemlerine sınıfın dışından erişilebileceği anlamına gelir

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@Interface, özel ivarlar, özellikler ve yöntemler bildirmenize olanak tanır. Yani burada beyan ettiğiniz hiçbir şeye bu sınıfın dışından erişilemez. Genel olarak, tüm ivarları, özellikleri ve yöntemleri varsayılan olarak özel olarak bildirmek istersiniz.

Basitçe, ABC.m dosyasında değişken yöntemlerini veya özelliklerini bildirdiğinizde, bu, bu değişkenlerin özelliklerine ve yöntemlerine sınıfın dışında erişilemeyeceği anlamına gelir.

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end

0

.m dosyasında başka sınıflar da oluşturabilirsiniz, örneğin .h dosyasında bildirilen sınıftan miras alan ancak biraz farklı davranışa sahip diğer küçük sınıflar. Bunu bir fabrika modelinde kullanabilirsin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.