2010-01-19 17 views
24

Tôi đã sử dụng -performSelectorInBackground trong nhiều ứng dụng của mình, loại không biết đến -detachNewThreadSelector. Bây giờ tôi tự hỏi những gì khác biệt giữa hai người. Họ có khá nhiều hoán đổi cho nhau, hoặc có sự khác biệt và những nơi mà người ta vượt trội hơn người kia không? Cảm ơn!Sự khác biệt giữa [NSThread detachNewThreadSelector:] và -performSelectorInBackground

Trả lời

31

Chúng giống nhau. Xem documentation.

performSelectorInBackground: withObject: Hiệu quả của việc gọi phương pháp này cũng giống như nếu bạn gọi là detachNewThreadSelector: toTarget: withObject: phương pháp NSThread với đối tượng, chọn, và đối tượng tham số hiện nay như tham số.

+0

Điều đó làm cho ý nghĩa, vì performSelectorInBackground: withObject: được liệt kê dưới NSObject (NSThreadPerformAdditions) loại ... vì vậy tôi đặt cược nó theo nghĩa đen chỉ là một lời kêu gọi detachNewThreadSelector: toTarget: withObject: P – Sahil

+0

Hãy bỏ qua bình luận cuối cùng của tôi, tôi đã nói qua phía sau của tôi. – Emmanuel

5

Như Michael nói, chúng giống hệt nhau. Tôi nghĩ rằng, để sử dụng một chuỗi bởi performSelectorInBackground: withObject: là cách dễ dàng hơn là NSThread.

Tuy nhiên, NSThread có thể kiểm soát ưu tiên, xếp chồng, v.v. Nếu bạn muốn tùy chỉnh hành vi, tôi khuyên bạn nên NSThread thay vì performSelectorInBackground: withObject:.

2

Thú vị các bạn không thể chỉ ra bất kỳ sự khác biệt giữa họ-

tôi sẽ cho bạn biết nhiều này. Chúng tôi có một ứng dụng iPhone đã bị khóa trong khi chúng tôi hiển thị biểu tượng tiết lộ "hoạt động internet" ở thanh trên cùng và cửa sổ cho biết "Đang gửi ..." trong khi chúng tôi gửi tệp âm thanh tới máy chủ và performSelectorInBackground: đã không làm việc. Khi chúng ta hoán đổi performSelectorInBackground với detachNewThreadSelector, nó hoạt động tốt nhưng bây giờ nó phàn nàn rằng không có autoreleased đối tượng đang chạy trong chủ đề đó có thể được giải phóng bên hồ bơi .. có thể điều này là do hồ bơi nằm trong chủ đề chính?

+2

tôi nghĩ rằng bạn nên có một hồ bơi autorelease cho mỗi chủ đề. –

3

Corey, nếu bạn đang chạy trên một chủ đề mới và bạn đang sử dụng [đối tượng autorelease], bạn sẽ cần phải tạo hồ bơi tự động của riêng bạn. Khá đơn giản để làm:

- (void)uploadDataOnThread 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // do something here... 

    [pool release]; 
} 
+0

Tôi nghĩ rằng đó là phát hành '[pool drain]' –

+0

và thoát ra hầu như giống nhau: http://stackoverflow.com/a/799257/545726 – aiham

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