2010-04-23 24 views
8

tôi cần phải gọi một phương thức bắt đầu một số mã không đồng bộObjective-C: Làm thế nào để sử dụng managment bộ nhớ đúng cho các phương pháp không đồng bộ

MyClass* myClass = [[MyClass alloc] init]; 
[myClass startAsynchronousCode]; 

Bây giờ tôi không thể chỉ đơn giản là phát hành nó như thế này sẽ gây ra lỗi từ mã là vẫn đang chạy:

[myClass release]; // causes an error 

Cách tốt nhất để xử lý bộ nhớ là gì?

Trả lời

4

Bạn có thể có - [MyClass startAsynchronousCode] gọi một callback:

typedef void(*DoneCallback)(void *); 

-(void) startAsynchronousCode { 
    // Lots of stuff 
    if (finishedCallback) { 
    finishedCallback(self); 
    } 
} 

và sau đó nhanh chóng một MyClass như thế này:

MyClass *myClass = [[MyClass alloc] initWith: myCallback]; 

myCallBack có thể trông như thế này:

void myCallback(void *userInfo) { 
    MyClass *thing = (MyClass *)userInfo; 
    // Do stuff 
    [thing release]; 
} 
+1

Khi phương pháp 'myCallBack' kết thúc sẽ không thực hiện mã trở về sự kết thúc của phương pháp đó được gọi là gọi lại: 'startAsynchronousCode 'vừa mới được đề cập đến? – Robert

+1

Có, đó là lý do tại sao điều quan trọng là bạn thực sự được thực hiện trước khi gọi lại gọi lại. Bạn sẽ không nhận được bất kỳ vi phạm truy cập nào trừ khi bạn tự giới thiệu sau khi gọi lại. –

+1

Tôi nghĩ bạn đang hỏi "howAsyncchronousCode asynchronous như thế nào?" trong bình luận của bạn? Thành ngữ trên có nghĩa là khi bạn tạo một luồng và chạy startAsynchronousCode từ bên trong luồng mới đó. –

0

Những gì tôi đã luôn luôn thực hiện được duy trì một biến thể hiện trỏ đến đối tượng không đồng bộ.

- (id)init { 
    myClass = [[MyClass alloc] init]; 
    [myClass startAsynchronousCode]; 
} 

- (void)myClassDidFinish:(MyClass *)myClass { 
    [myClass release]; 
} 
1

Bạn phải giữ đối tượng myClass bên trong phương thức startAsynchronousCode. Và phát hành nó trong nội bộ quá sau khi nó kết thúc.

Hành vi này được sử dụng trong NSURLConnection, UIAlertView và các đối tượng không đồng bộ khác.

3

Bạn gọi mã không đồng bộ như thế nào? Nếu bạn sử dụng NSThread +detachNewThreadSelector:toTarget:withObject:, bạn sẽ thấy rằng đối tượng đích được giữ lại bởi luồng cho đến khi nó kết thúc và sau đó nó được giải phóng. Vì vậy, bạn có thể giải phóng đối tượng ngay sau thông báo không đồng bộ.

ví dụ:

@implementation MyClass 

-(void) startAsynchronousCode 
{ 
    [NSThread detachNewThreadSelector: @selector(threadMain:) toTarget: self withObject: nil]; 
} 

-(void) threadMain: (id) anObject 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    // do stuff 
    [pool drain]; 
} 
@end 

Với trên, đoạn mã sau là hoàn toàn an toàn:

MyClass* myClass = [[MyClass alloc] init]; 
[myClass startAsynchronousCode]; 
[myClass release]; 
+0

Nó rất hữu ích ... Cảm ơn. – jfalexvijay

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