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


81

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

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

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ã, phương thức @interface ..... @ end này cũng được giữ trong tệp .m. Nó có nghĩa là gì? sự khác biệt giữa chúng là gì?

Đồng thời cung cấp một số từ về getters và setters cho tệp giao diện được xác định trong tệp .m ...

Cảm ơn trước

Câu trả lời:


63

Người ta thường đặt một bổ sung @interfacexác định một danh mục chứa các phương thức riêng tư:

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ư' (tên riêng của danh mục không tên không phải là 'danh mục riêng tư', nó là 'phần 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ì @interfacetệp trong tệp .m là một danh mục nên bạn không thể xác định các ivars trong đó.

Cập nhật ngày 6 tháng 8 năm '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 phần mở rộng lớp (và luôn luôn có thể - câu trả lời không chính xác)
  • @synthesize không được yêu cầu
  • ivarsbây giờ có thể được khai báo trong dấu ngoặc nhọn ở đầu @implementation:

đó là,

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

4
Chú thích nhỏ, không thực sự đặt bất cứ điều gì trong dấu ngoặc đơn khi bạn khai báo giao diện riêng tư. Nếu không, nó chỉ tạo ra một danh mục 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

4
Nếu mọi người quan tâm để biết thêm về các danh mục .. trang này rất hữu ích đối với tôi.
Tim

1
Nếu không có gì trong ngoặc thì điều này thực sự được gọi là class extensionkhông phảicategory
Paul.s

5
@ 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 khai báo cho một phương thức nếu thân phương thức là 'hiển thị'. Điều này có nghĩa là các lớp liên tục ( @interface className ()) nói chung bây giờ sẽ chỉ chứa các private @property.
Benedict Cohen

10

Khái niệm là bạn có thể làm cho dự án của mình gọn gàng hơn nhiều nếu bạn giới hạn .h trong các giao diện công khai của lớp, sau đó đặt các chi tiết triển khai riêng tư trong phần 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, Điều đó có nghĩa là các thuộc tính và phương thức của biến này có thể được truy cập bên ngoài lớp

@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 ivars, thuộc tính và phương thức riêng. 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, thuộc tính và phương thức theo mặc định là private

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

@interface Jain()
    {
        NSString *_name;
    }

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

0

bạn thậm chí có thể tạo các lớp khác trong tệp .m, chẳng hạn như 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 hơi khác. Bạn có thể sử dụng điều này trong mô hình nhà máy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.