2010-10-11 18 views
44

bất kỳ ai có thể vui lòng giải thích cho tôi những gì khai báo @class làm trong mục tiêu & các trường hợp mà chúng ta nên sử dụng khai báo này là gì.@class làm gì trong Objective-C?

Trả lời

83

Đó là tuyên bố chuyển tiếp. Về cơ bản nó nói với trình biên dịch rằng có một lớp của tên đó. Tôi sử dụng nó trong tờ khai giao diện:

@class Foo; 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Tất nhiên bạn có thể nhập tiêu đề cho Foo thay vì:

#import "Foo.h" 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Nhưng nếu someFoo không tiếp xúc với người sử dụng Bar, họ sẽ nhập một tiêu đề phụ tệp không sử dụng chúng. Với tuyên bố @class, người dùng của Bar sẽ không nhập thêm, vì Foo.h sẽ được nhập trong tệp triển khai Bar.

+1

Giải thích rõ ràng, Chỉ cần tìm hiểu điều gì đó mới mẻ! Cảm ơn bạn – pnizzle

+0

Tôi vẫn không hiểu nó đầy đủ và tôi biết một bài cũ của nó, nhưng và ví dụ sẽ là tốt. Những gì bạn có ý nghĩa của "Người dùng của Bar", các lớp học sẽ có thanh như một đối tượng trong đó? Imean trong ví dụ của bạn Foo là một đối tượng trong Bar. Vì vậy, sự khác biệt giữa #import và @class trong tình huống này? – Esko918

+0

Thực sự là một lời giải thích tuyệt vời. Tôi phải đối mặt với một tình huống trước đó, nơi tôi nên sử dụng nó. Dù sao, bây giờ tôi chắc chắn có thể. :) – Ron

23

nó được gọi là tuyên bố chuyển tiếp.

bạn sử dụng chỉ thị này để cho trình biên dịch biết rằng có một lớp objc có tên được chỉ định. các tùy chọn khác của bạn là bao gồm giao diện hoặc sử dụng id cho các biến hoặc loại.

điều này hữu ích để giảm thiểu sự phụ thuộc. tôi sử dụng chúng bất cứ khi nào tôi có thể để giảm thiểu phụ thuộc, và giảm đáng kể thời gian xây dựng.

nó giống như trong C và C++:

struct mon_struct; 
namespace MON { class mon_class; } 
+3

+1 để nghiêng rằng điều này nên được ưu tiên để giảm thời gian xây dựng. –

1

@class được sử dụng để tạo ra tuyên bố bất kỳ lớp. Nếu bạn đang tạo bất kỳ lớp nào mà việc triển khai thực hiện không được biết cho bạn thì bạn có thể thực hiện điều này bằng cách sử dụng chỉ thị biên dịch @class.

Bạn có thể triển khai lớp này khi triển khai được bạn biết.

8

hy vọng điều này sẽ giúp ít hơn

Câu trả lời trên đã nêu rõ hầu hết mọi thứ, tôi muốn thêm một số điều vào đó.

@class Foo là khai báo chuyển tiếp của lớp Foo. Nó giống như nói với trình biên dịch, lớp foo tồn tại Vậy đừng bận tâm về nó ngay bây giờ.

Lưu ý: - Khai báo lớp học trở nên rất quan trọng khi cả hai lớp cần nhau. nếu chúng ta thực hiện câu lệnh #import bình thường thì chúng ta sẽ có một vòng lặp nhập khẩu vô tận và Trình biên dịch không thích các vòng lặp vô tận. Vì vậy, chúng tôi sử dụng @class Classname.

Các vấn đề liên quan