Pertanyaan Perbedaan antara definisi @interface dalam file .h dan .m


Biasanya kami gunakan

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

dalam file .h dan dalam file .m kami mensintesis properti dari variabel yang dideklarasikan dalam file .h.

Tetapi dalam beberapa kode, metode @@faceface @ @ ini disimpan di file .m juga. Apa artinya? Apa perbedaannya?

Juga berikan beberapa kata tentang getter dan setter untuk file antarmuka yang didefinisikan dalam file .m ...

Terima kasih sebelumnya


76
2017-10-19 09:59


asal


Jawaban:


Ini umum untuk menambahkan tambahan @interface yang mendefinisikan kategori yang mengandung metode pribadi:

Person.h:

@interface Person
{
    NSString *_name;
}

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

Person.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

'Kategori privat' (nama yang tepat untuk kategori tanpa nama bukan 'kategori privat', itu adalah 'ekstensi kelas') .m mencegah kompilator memperingatkan bahwa metode tersebut didefinisikan. Namun, karena itu @interface dalam file .m adalah kategori Anda tidak dapat mendefinisikan ivars di dalamnya.

Perbarui 6 Agustus '12: Objective-C telah berevolusi sejak jawaban ini ditulis:

  • ivars dapat dideklarasikan dalam ekstensi kelas (dan selalu bisa - jawabannya tidak benar)
  • @synthesize tidak diperlukan
  • ivars sekarang dapat dinyatakan dalam tanda kurung di bagian atas @implementation:

itu adalah,

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

59
2017-10-19 10:35



Konsepnya adalah Anda dapat membuat proyek Anda jauh lebih bersih jika Anda   batasi .h ke antarmuka publik kelas Anda, lalu letakkan   perincian implementasi pribadi di ekstensi kelas ini.

ketika Anda mendeklarasikan metode atau properti variabel dalam file ABC.h, Ini   berarti properti dan metode variabel ini dapat diakses di luar   kelas

@interface Jain:NSObject
{
    NSString *_name;
}

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

@Interface memungkinkan Anda untuk mendeklarasikan ivars pribadi, properti, dan   metode. Jadi apa pun yang Anda nyatakan di sini tidak dapat diakses dari luar   kelas ini. Secara umum, Anda ingin mendeklarasikan semua ivars, properti dan   metode secara default sebagai pribadi

Katakan saja ketika Anda mendeklarasikan metode variabel atau properti di ABC.m   file, Artinya variabel properti dan metode tidak bisa   akses di luar kelas

@interface Jain()
    {
        NSString *_name;
    }

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

7
2018-04-01 16:50



Anda bahkan dapat membuat kelas lain dalam file .m, misalnya kelas-kelas kecil lainnya yang mewarisi dari kelas yang dinyatakan dalam file .h tetapi memiliki sedikit perilaku yang berbeda. Anda bisa menggunakan ini dalam pola pabrik


0
2017-12-09 18:19