Câu hỏi Sự khác biệt giữa định nghĩa @interface trong tệp .h và .m


Thông thường chúng tôi sử dụng

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

phương thức trong tệp .h và trong tệp .m, chúng tôi tổng hợp các thuộc tính của các biến được khai báo trong tệp .h.

Nhưng trong một số mã, @interface này ..... @ phương pháp cuối cùng được lưu giữ trong tập tin .m cũng. Nó có nghĩa là gì? sự khác biệt giữa chúng là gì?

Cũng cung cấp một số từ về getters và setters cho tệp giao diện được định nghĩa trong tệp .m ...

Cảm ơn trước


76
2017-10-19 09:59


gốc




Các câu trả lời:


Nó phổ biến để đặt thêm @interface định nghĩa một thể loại chứa các phương thức riêng:

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

'Danh mục riêng' (tên riêng cho danh mục không tên không phải là 'danh mục riêng tư', đó là 'mở rộng lớp') .m ngăn trình biên dịch cảnh báo rằng các phương thức được xác định. Tuy nhiên, vì @interface trong tập tin .m là một thể loại mà bạn không thể xác định được ivars trong đó.

Cập nhật 6th Aug '12: Objective-C đã phát triển kể từ khi câu trả lời này được viết:

  • ivars có thể được khai báo trong một phần mở rộng của lớp (và luôn luôn có thể - câu trả lời là không chính xác)
  • @synthesize không được yêu cầu
  • ivars bây giờ có thể được khai báo trong niềng răng ở đầu @implementation:

đó là,

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

60
2017-10-19 10:35



Sidenote nhỏ, không thực sự đặt bất cứ điều gì trong ngoặc đơn khi bạn khai báo giao diện riêng. Nếu không, nó chỉ tạo ra một thể loại, và bạn không muốn điều đó. @interface Person () sẽ đủ. - Itai Ferber
Cảm ơn itaiferber, tôi đã không nhận thấy điều đó. Tôi đã cập nhật câu trả lời của mình. - Benedict Cohen
Nếu mọi người quan tâm để biết thêm về các danh mục .. trang rất hữu ích với tôi. - Tim
Nếu không có gì trong dấu ngoặc thì điều này thực sự được gọi là class extension không phải là category - Paul.s
@ giant91 Câu trả lời này khá cũ và trình biên dịch đã được cải thiện rất nhiều kể từ khi nó được viết ban đầu. Trình biên dịch không còn cần một khai báo cho một phương thức nếu thân phương thức là 'có thể nhìn thấy'. Điều này có nghĩa là việc tiếp tục lớp học (@interface className ()) nói chung bây giờ sẽ chỉ chứa riêng @propertyS. - Benedict Cohen


Khái niệm là bạn có thể làm cho dự án của bạn sạch sẽ hơn nhiều nếu bạn   giới hạn .h cho giao diện công khai của lớp học của bạn, và sau đó đặt   chi tiết triển khai riêng tư trong tiện ích mở rộng lớp này.

khi bạn khai báo các phương thức hoặc thuộc tính biến trong tệp ABC.h, nó   có nghĩa là các thuộc tính và phương thức biến này có thể truy cập bên ngoài   lớp học

@interface Jain:NSObject
{
    NSString *_name;
}

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

@Interface cho phép bạn khai báo các thuộc tính riêng, các thuộc tính và   phương pháp. Vì vậy, bất cứ điều gì bạn khai báo ở đây không thể được truy cập từ bên ngoài   lớp này. Nói chung, bạn muốn khai báo tất cả các ivars, properties và   theo mặc định là riêng tư

Đơn giản chỉ cần nói khi bạn khai báo các phương thức hoặc thuộc tính biến trong ABC.m   tập tin, Nó có nghĩa là các thuộc tính và phương pháp biến không thể   truy cập bên ngoài lớp học

@interface Jain()
    {
        NSString *_name;
    }

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

8
2018-04-01 16:50





bạn thậm chí có thể tạo các lớp khác trong tệp .m, ví dụ các lớp nhỏ khác kế thừa từ lớp được khai báo trong tệp .h nhưng có một số hành vi khác nhau nhỏ. Bạn có thể sử dụng điều này trong một mẫu nhà máy


0
2017-12-09 18:19