2010-08-26 37 views

Trả lời

37

(Tôi sẽ giả loggedIn là một phương pháp dụ dùng không có thông số.) Thứ nhất, một số vấn đề ngữ:

  1. Họ không hoạt động, chúng là các phương thức (cùng một ý tưởng).
  2. Bạn không gọi phương thức, bạn gửi tin nhắn (thường là cùng một ý tưởng).
  3. Quan trọng nhất, chúng tôi thường gửi tin nhắn không đến lớp học, nhưng để trường hợp của các lớp đó. (Nếu bạn không thể hình dung sự khác biệt, hãy tưởng tượng đặt một bức thư trong ý tưởng về hộp thư vs đặt một bức thư trong hộp thư của bạn . Chỉ có một ý nghĩa!)

Vì vậy, kế hoạch mới của chúng tôi là trước tiên, hãy khởi tạo SomeScript, sau đó gửi tin nhắn đến ví dụ.

SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript 
[myScript loggedIn]; //Next, we send the loggedIn message to our new instance 

Điều này là tốt. Tuy nhiên! Tôi đặt cược bạn muốn kịch bản của bạn để dính xung quanh để sử dụng sau này. Vì vậy, chúng ta nên thực sự biến nó thành một biến thể hiện của ủy nhiệm ứng dụng của bạn. Vì vậy, thay vào đó, trong AppDelegate.h, thêm này bên trong dấu ngoặc:

SomeScript* myScript; 

Bây giờ biến của chúng tôi sẽ dính vào xung quanh, và dòng đầu tiên của chúng tôi từ trước khi trở thành đơn giản:

myScript = [[SomeScript alloc] init]; 

biến chứng cuối: chúng tôi không muốn để tạo ra một mới mỗi lần chúng tôi gọi loggedIn (tôi giả định)! Vì vậy, bạn nên đặt instantiation ở đâu đó nó sẽ chỉ được chạy một lần (ví dụ, application:DidFinishLaunchingWithOptions:). Ta-da!

+0

Bạn cần thêm gì đó vào việc phát hành myScript – JeremyP

+0

@JeremyP: Đó là trong AppDelegate của mình. @ChristianStewart: Quyền của Jeremy, bạn thường nên gửi 'release' sang' myScript' khi bạn đã hoàn thành nó. Tôi đã không nói với bạn bởi vì tôi cho rằng bạn sẽ sử dụng nó trong suốt thời gian ứng dụng của bạn mở. – andyvn22

+0

Nó không gây hại gì để có thói quen tốt. Về mặt kỹ thuật, bạn không cần phải giải phóng mọi thứ mà đại biểu ứng dụng của bạn nắm giữ vì ứng dụng ủy nhiệm chính nó vẫn tồn tại cho đến khi kết thúc. Tuy nhiên, đó là một ý tưởng tốt để có được thói quen đưa bản phát hành vào -dealloc. Nó cần phải trở thành tự động. – JeremyP

3

Bạn phải có một tài liệu tham khảo khởi tạo của một đối tượng SomeScript trong lớp appdelegate của bạn (giả bạn không cần SomeScript là một lớp Singleton như appdelegate của bạn). Một cái gì đó như:

SomeScript * myScript;

như một Ivar trong giao diện appdelegate của bạn, trong khi ở nó application:DidFinishLaunchingWithOptions:

bạn đã inited nó (giả sử với cách gọi alloc default/init kết hợp):

myScript = [[SomeScript alloc] init]

Xong tất cả điều này, khi bạn cần gọi một phương thức của myScript, bạn chỉ cần thực hiện:

[myScript myMethod:myParameter]

Here bạn có thể tìm thấy một hướng dẫn tốt đẹp cho người mới bắt đầu từ Apple

1

Nếu bạn không muốn sử dụng các phiên bản của SomeScript ... bạn có thể làm theo một cách tiếp cận khác. Sử dụng NSNotificationCenter để gửi một thông báo đến đối tượng SomeScript của bạn và làm cho nó chạy một bộ chọn sau đó.

Trong bạn - Phương pháp (void) awakeFromNib {}, từ SomeScript đặt đoạn mã sau:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mySelector:) 
               name:@"aUniqueNameForTheNotification" 
               object:nil]; 

Tạo phương pháp "mySelector:" và đặt các cuộc gọi đến phương pháp LOGGEDIN của bạn. (Hoặc nếu bạn thích, bạn có thể thay thế "mySelector:" với LOGGEDIN trực tiếp)

-(void) mySelector:(id)elem 
{ 
    [self loggedIn]; 
} 

Sau đó, đừng quên để loại bỏ các quan sát viên trên dealloc, vì vậy đặt đoạn mã sau đây trong lớp SomeScript của bạn cũng:

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

Sau đó, bạn có thể gửi một thông báo từ bất kỳ khác như vậy:

[[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification" object:self]; 

Đó mảnh cuối cùng của mã sẽ gửi một thông báo đến SomeScript và chọn của bạn được thực thi.

Hy vọng nó sẽ giúp các bạn!

1

Chúng ta có thể gọi nó như [self loggedIn]
Khi LOGGEDIN phương pháp là trong SomeScript lớp, sử dụng cú pháp đơn giản trong xcode mới nhất.

[[SomeScript new] loggedIn]; 
+0

Điều này có yêu cầu deallocating sau đó không? Tôi giả sử không có cách nào để .. – durazno

+1

với ARC không có yêu cầu deallocation. –

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