2012-02-10 26 views
10

Bạn có thể gán AppDelegate làm biến mẫu trong UIViewController không? Giống như @property (nonatomic, weak) AppDelegate *appDelegate;iOS - AppDelegate làm biến mẫu?

Tại sao tôi hỏi là vì tôi cần phải truy cập vào nó khá thường xuyên nên thay vì thực hiện:

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

[appDelegate doSomething]; 

tôi có thể làm:

[appDelegate doSomething]

+2

Nếu bạn thường xuyên truy cập vào trang này, tại sao không di chuyển công việc đó sang nơi khác? – Osiris

Trả lời

12

Hoặc bạn có thể làm

-(YourAppDelegate*) app 
{ 
    return (YourAppDelegate*) [[UIApplication sharedApplication] delegate]; 
} 

Trong một lớp con của UIViewController - vậy thì hãy chờ cơ sở đẳng cấp của tất cả các bộ điều khiển tầm nhìn của bạn.

Sau đó, [self app] hoạt động và bạn không phải giữ tham chiếu.

Tôi làm điều này để giữ một số tiện ích phổ biến đơn giản ở đó - bạn cũng có thể làm điều này với một danh mục.

4

Sự khác biệt giữa truy cập ủy quyền bằng biểu thức đầy đủ so với thuộc tính (nonatomic, weak) là tùy ý. Chắc chắn, hãy lưu lại các dòng mã bằng cách định nghĩa một thuộc tính nếu bạn định gọi nó thường xuyên.

Tuy nhiên, câu hỏi đặt ra vấn đề lớn hơn về vấn đề đóng gói có thể xảy ra. Thực hành tốt nhất cho thấy rằng các cuộc gọi đi xuống hệ thống phân cấp so với lên. Tất nhiên, ứng cử viên là một trường hợp đặc biệt, nhưng tôi khuyên bạn nên xem xét các cách có thể để cô lập bất kỳ tài nguyên nào mà bạn cần từ ứng dụng đại biểu và chuyển các tham chiếu này xuống hệ thống phân cấp bộ điều khiển xem của bạn. tạo.

16

Có thể nó có thể ổn.

Nhưng giải pháp yêu thích của tôi là như sau.

Trong AppDelegate.h

+ (AppDelegate *)appDelegate; 

Trong bạn AppDelegate.m

+ (AppDelegate *)appDelegate 
{ 
    return (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

của bạn Sau đó sử dụng bất cứ nơi nào bạn muốn:

AppDelegate* sharedDelegate = [AppDelegate appDelegate]; 

Một số lưu ý:

nếu bạn sử dụng AppDelegate cho dữ liệu được chia sẻ, bạn có thể đọc singletons-appdelegates-and-top-level.html.

nếu bạn sử dụng AppDelegate cho việc ứng dụng logic của bạn, bạn có thể đọc handling-your-initial-view-controllers-for-iphone/

Hy vọng nó giúp.

+0

'getAppDelegate' vi phạm [nguyên tắc đặt tên] của Apple (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282- BCIGIJJF).Một tên tốt hơn sẽ là '+ (AppDelegate *) appDelegate;' hoặc '+ (AppDelegate *) sharedAppDelegate;' –

+0

@AlexPretzlav cảm ơn bạn đã chỉnh sửa. –