2012-05-04 13 views
7

Tôi đang sử dụng đối tượng App Delegate trong các lớp khác nhau. Tôi muốn truy cập nó trong toàn bộ dự án. Định nghĩa đối tượng này trong tệp Prefix.pch làSử dụng #define để truy cập App Delegate Object không hoạt động

#define Appdelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] 

nhưng vấn đề là biến Appdelegate không truy cập biến đại biểu ứng dụng. nó Hiển thị lỗi.

nhưng nếu sáng sử dụng mã này hoạt động tốt

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.variablename; 

Tôi có làm nó đúng hay là có một cách để làm những gì tôi làm gì?

cảm ơn trước.

Trả lời

15

nên là:

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 
//     ^----------------------parenthesis--------------------------^ 
+5

Yup. Với '# define', làm' [Appdelegate variablename] 'sẽ hoạt động, nhưng không phải' Appdelegate.variablename'. Bởi vì nếu bạn bỏ qua dấu ngoặc đơn bên ngoài, thì phép đúc thành '(AppDelegate *)' sẽ được thực hiện trên toàn bộ biểu thức, trong trường hợp này là 'variablename' của bạn. – Cyrille

+1

cảm ơn Sharet, nó hoạt động tốt ngay bây giờ. – Bond

1

Như câu hỏi này và câu trả lời của nó chứng minh, dựa vào các tiền xử lý thường là một ý tưởng tồi.

  1. Thật dễ dàng để làm mọi thứ sai. Tất cả chúng ta đều phát triển bản năng tốt cho ưu tiên vận hành, nhưng bộ tiền xử lý không có đầu mối. Để bảo vệ chống lại các vấn đề bối cảnh bất ngờ, bạn thường cần phải bọc tất cả mọi thứ trong parens thêm và niềng răng.

  2. Thật dễ dàng để thuyết phục bản thân rằng bạn đang làm một việc khi mã đang hoạt động khác. Khi mọi thứ bị hỏng, không phải thông báo lỗi của trình biên dịch cũng như trình gỡ lỗi có thể giúp ích nhiều.

  3. Quan trọng nhất, bộ tiền xử lý có thể cho phép bạn lấy ý tưởng tồi và trải rộng qua chương trình. Ý tưởng tồi ở đây là sử dụng App Delegate trên toàn cầu.

Biến toàn cầu là một mã nguồn. Nỗ lực làm cho các biến toàn cầu thậm chí còn toàn cầu hơn bằng cách nhồi chúng vào các phần đầu được biên dịch trước là một mùi mã. Nếu khuôn khổ nghĩ rằng bạn nên có quyền truy cập vào AppDelegate từ khắp mọi nơi, bạn sẽ không cần phải nhảy qua các vòng (khiêm tốn) này! Vì vậy, khi bị cám dỗ để làm một cái gì đó như thế này, nó là tốt đẹp để biết tiền xử lý là có và các tiêu đề pch đang có, nhưng hãy nhớ rằng bạn đang chiến đấu khuôn khổ và gần như chắc chắn làm cho một lỗi thiết kế. Điều đó có thể được chấp nhận trong bối cảnh của bạn, nhưng đó là điều cần biết.

2

Bạn cần phải nhập khẩu tập tin appdelegate bạn đang ở đâu tuyên bố đại diện vĩ mô:

nhập khẩu "AppDelegate.h"

Và sau đó xác định

xác định appdelegate (((appdelegate *) [[UIApplication sharedApplication ] đại biểu]))

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