2012-05-03 17 views
5

tôi đã tạo một chuỗi trong xcode và tôi đã đặt tên hàm được gọi từ chuỗi đó. nhưng vấn đề của tôi là tên hàm mà được trao cho gọi không được gọi là (đến để biết khi đặt một breakpoint trong chức năng đó)gọi hàm bằng cách sử dụng chuỗi trong xcode

mã:

NSThread* myThread; 
[myThread start]; 
[self performSelector:@selector(func1:) onThread:myThread withObject:nil waitUntilDone:false] 

và sau đó tôi đã cố gắng này cũng :

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(func1:)object:nil]; 
[myThread start]; 

trên func1 là tên của hàm được gọi.

như vậy có thể bất kỳ một xin vui lòng cho tôi biết làm thế nào để tạo ra các chủ đề và gọi Func1 từ đó ....

Trả lời

16

Trong mẫu mã đầu tiên của bạn, có vẻ như bạn đang thực sự tạo một chuỗi mới. Bạn tạo biến số myThread trống và sau đó gọi start trên đó nhưng điều này sẽ chỉ dẫn đến start được gửi đến nil. Biến chủ đề rỗng sau đó được gửi đến phương thức performSelector:onThread:withObject:waitUntilDone: mà có lẽ sẽ không làm gì cả.

Bạn cần phải tạo chủ đề đúng cách trước khi thực sự có thể chạy một thứ gì đó trên đó bằng cách sử dụng performSelector:onThread:withObject:waitUntilDone:.

Ngoài ra, nó sẽ dễ dàng hơn nhiều, giả sử bạn không quan tâm chủ đề nền mà phương thức chạy, chỉ cần sử dụng performSelectorInBackground:withObject:. Ví dụ:

[self performSelectorInBackground:@selector(func1:) withObject:nil]; 
+0

cảm ơn bạn đã trả lời, nhưng một số lần nó lấy chủ đề chính mà tôi không muốn ..... –

+0

Tôi muốn biết bất kỳ thông tin nào bạn có về 'performSelectorInBackground: withObject:' bằng cách sử dụng chuỗi chính . Tài liệu của Apple nói "Phương pháp này tạo ra một luồng mới trong ứng dụng của bạn, đưa ứng dụng của bạn vào chế độ đa luồng nếu nó chưa được". Nếu bạn có thông tin cho thấy rằng đôi khi nó sử dụng chủ đề chính tôi muốn được quan tâm để xem nó. – mttrb

+0

xin lỗi các hành động đã không diễn ra trên chủ đề chính, kể từ sau khi func1 ':' là có, nó đã không chạy và tôi nghĩ rằng nó đang lấy thread.but chính bây giờ khi tôi gỡ bỏ ':' (theo câu trả lời khác cho câu hỏi này) nó đang làm việc tốt .. cảm ơn cho trả lời ...... –

3

Hãy thử những điều sau nếu nó hoạt động:

[NSThread detachNewThreadSelector:@selector(func1) toTarget:self withObject:nil]; 

Vì bạn đang không đi qua bất kỳ đối tượng đến "func1" (còn gọi là: phương thức của bạn không có tham số), bạn không cần đặt ":" sau tên của nó.

0

Nếu func1 của bạn chấp nhận một đối số. Sau đó, chắc chắn nó phải làm việc với cách tiếp cận thứ hai mà bạn sử dụng. Có thể là fuc1 của bạn không có đối số chính thức và vẫn u gọi trong bộ chọn như thế này @selector (fuc1 :) và đối tượng đi qua như là một số không. do đó có thể là do lý do này nó không hoạt động. Nó có thể là một lý do. chỉ cần thử nó nếu không.

+0

Bất cứ khi nào bạn đang sử dụng bất kỳ đối tượng nào của bất kỳ lớp nào, đừng bao giờ quên cấp phát bộ nhớ, như bạn đã làm trong cách tiếp cận đầu tiên của mình. – iDevAmit