2010-04-11 36 views
21

Tôi vừa mới bắt đầu học mục tiêu C và tôi thực sự bối rối cách các tệp .h và .m tương tác với nhau. chương trình đơn giản này có 3 file:Mô tả ngắn gọn về cách các tệp .h và .m tương tác trong mục tiêu c?

Fraction.h

#import <Foundation/NSObject.h> 
    @interface Fraction : NSObject { 
     int numerator; 
int denominator; 
    } 
    - (void) print; 
    - (void) setNumerator: (int) n; 
    - (void) setDenominator: (int) d; 
    - (int) numerator; 
    - (int) denominator; 
    @end 

Fraction.m

#import "Fraction.h" 
    #import <stdio.h> 
    @implementation Fraction 
    -(void) print { printf("%i/%i", numerator, denominator); } 
    -(void) setNumerator: (int) n { numerator = n; } 
    -(void) setDenominator: (int) d { denominator = d; } 
    -(int) denominator { return denominator; } 
    -(int) numerator { return numerator; } 
    @end 

Main.m

#import <stdio.h> 
    #import "Fraction.h" 
    int main(int argc, char *argv[]) { 
     Fraction *frac = [[Fraction alloc] init]; 
[frac setNumerator: 1]; 
[frac setDenominator: 3]; 
printf("The fraction is: "); 
[frac print]; 
printf("\n"); 
[frac release]; 
return 0; 
    } 

Từ những gì tôi hiểu, chương trình ban đầu bắt đầu chạy tập tin main.m. Tôi hiểu các khái niệm C cơ bản nhưng toàn bộ công cụ "class" và "instance" này thực sự khó hiểu. Trong tệp Fraction.h, @interface định nghĩa tử số và mẫu số như một số nguyên, nhưng nó còn làm gì dưới đây với (void)? và mục đích xác định lại dưới đây là gì? Tôi cũng khá bối rối như những gì đang xảy ra với các phần (void) và (int) của Fraction.m và cách tất cả điều này được tập hợp lại trong tệp main.m. Tôi đoán những gì tôi đang cố gắng để nói là điều này có vẻ như một chương trình khá dễ dàng để tìm hiểu làm thế nào các phần khác nhau làm việc với nhau - bất cứ ai có thể giải thích trong thuật ngữ không công nghệ cao?

Trả lời

5

Các tệp không tương tác chút nào, sử dụng chúng chỉ là quy ước, bạn cũng có thể đặt mọi thứ vào tệp main.m.

Điểm khởi đầu tốt cho việc học Mục tiêu-C là introduction to the Objective-C language.

10

Bạn cần phải có một cái nhìn vào Object Oriented Programming và có lẽ đọc nhiều hơn một chút vào sự phát triển Objective-C để có được một nắm bắt tốt về các khái niệm về OOP vv

Để trả lời câu hỏi của bạn "sự khác biệt giữa .h là gì và .m tệp ", .h tệp chứa khai báo cho lớp của bạn, về cơ bản tất cả các thuộc tính và phương thức mà nó có thể sử dụng. Tệp .m là việc triển khai các phương thức này.

Trong thuật ngữ bố cục, tệp tiêu đề (.h) là cách nói "Đây là những gì tôi có thể làm" và .m là "Đây là cách tôi thực hiện". Đó là một chút phức tạp hơn sau đó mặc dù.

0

Tóm lại, lớp Objective-C là cấu trúc C. Một cá thể là một tham chiếu đến cấu trúc như vậy đã được cấp phát trong bộ nhớ. Một lớp có một tên và một cá thể có một trạng thái hoặc một giá trị.

Điều đặt lớp Objective-C ngoài cấu trúc C là khả năng tra cứu địa chỉ phương thức theo tên. Trong thuật ngữ đơn giản, cấu trúc có một bảng băm của con trỏ hàm được khóa theo tên.

Có rất nhiều thành phần khác trong các đối tượng Objective-C, như đếm tham chiếu, nhưng các phương thức gọi theo tên là mấu chốt của nó. SEL là một chuỗi C, nhưng một chuỗi C không phải là SEL.

Theo như tệp tiêu đề và nguồn, theo quy ước bạn khai báo giao diện cho một lớp trong tệp tiêu đề và xác định các phương thức trong tệp nguồn. Định nghĩa mọi thứ, ngoài các kiểu và hằng số, trong một tệp tiêu đề là một thực hành không tốt, như bao gồm các tệp nguồn. Bạn được tự do khai báo bất cứ điều gì bạn muốn trong một tệp nguồn, nhưng về cơ bản nó là riêng tư đối với tệp nguồn.

Thực thi C và do đó có thể thực thi Mục tiêu-C, có điểm vào tại hàm chính. Theo quy ước chính được định nghĩa trong một tập tin có cùng tên trong các dự án mục tiêu-C.

58

Những người đến từ các môi trường khác dường như luôn tin rằng có điều gì đó phức tạp đang xảy ra với các tệp .c, .m và .h được sử dụng trong lập trình C và Objective-C.

Thực ra, nó rất đơn giản.

Với mục đích xây dựng một dự án Môi trường phát triển tích hợp - như XCode - bỏ qua tất cả các tệp .h. Những gì họ làm là lấy từng tệp .c và .m và biên dịch nó. Nếu lập trình viên (thats you) đã sử dụng bất kỳ #include hoặC#import chỉ thị nào, trình biên dịch sẽ chèn toàn bộ văn bản của tệp .h được bao gồm/đã nhập vào, nơi chỉ thị được.

Vì vậy, nếu bạn đã có một tập tin .h - insert.h - mà nói:

in 

Và một file .c mà nói:

Alice 
#include "insert.h" 
Wonderland 

Trình biên dịch sẽ, sau khi xử lý #include & #import chỉ thị, hãy xem điều này:

Alice 
in 
Wonderland 

Đây là quá trình hợp nhất tệp rất đơn giản hành vi mà chúng tôi sử dụng để tạo các chương trình phức tạp :)

.h rất đơn giản là một quy ước mà các lập trình viên có thể nói với nhau rằng tệp phù hợp để được hợp nhất - nhiều khả năng - sử dụng #include hoặC#import.

Tệp .c và .m không được hợp nhất như vậy. Mỗi tệp .c và .m được biên dịch riêng biệt - để tạo các tệp .o. Mỗi tệp .o là tập hợp các hàm được biên dịch. Các tệp .o sau đó được hợp nhất - hoặc "được liên kết" - để tạo chương trình cuối cùng. Bước liên kết đảm bảo rằng mỗi hàm chỉ tồn tại một lần và tất cả các hàm được gọi thực tế tồn tại ở đâu đó.

C & Objctive-C xác định một hàm đặc biệt phải tồn tại ở đâu đó - main(). Một lần nữa, ngôn ngữ là rất thoải mái - nó không quan tâm mà .c hoặc .m tập tin các chức năng main() là in. Chỉ đơn giản là nó tồn tại trong một số tập tin ở đâu đó.

0

Các dòng mã dưới đây trong Fraction.h không phải là gì ngoài các phương thức getter. Họ không xác định lại hai biến int được khai báo ở trên chúng.

- (int) numerator; 
- (int) denominator; 
Các vấn đề liên quan