2008-11-20 29 views
15

Tôi đang sử dụng kiến ​​trúc MVC cho ứng dụng GUI. Lớp mô hình có một số hàm C. Một trong các hàm C gọi một số phương thức của lớp Objective-C. Tôi gọi những phương thức đó bằng cách sử dụng một đối tượng của lớp đó. Điều kỳ lạ xảy ra là các phương thức trước đó với phương thức xyz được gọi là hoàn hảo nhưng khi phương thức xyz đó được gọi, phương thức đó và các phương thức sau khi nó không được thực thi. Tôi không gặp bất kỳ lỗi nào. Vì vậy, không thể tìm ra chính xác những gì đang xảy ra. Bất kỳ ý tưởng nào về những gì có thể là lý do cho điều này?Không thể gọi phương thức C mục tiêu từ hàm C

+0

Bạn có thể gửi một số mã ? Nếu không nó sẽ không thể giúp được. –

+0

Tôi yêu cầu thứ hai. Một số mã đơn giản sẽ rất hữu ích. Ví dụ. chỉ là một số mã của hàm C cho thấy cách bạn thực sự truy cập đối tượng obj-c và cách bạn thực hiện cuộc gọi đến nó có thể rất hữu ích – Mecki

Trả lời

1

Bạn chắc chắn có thể chạy các phương thức trên các đối tượng Obj-C từ một hàm C, vì vậy có thể có lỗi trong mã của bạn tại một số điểm. Nếu tôi phải đoán, có vẻ như một vật thể không phải là nil khi bạn không mong đợi nó. Thông thường bạn sẽ bắt đầu bằng cách thiết lập các điểm ngắt trong hàm của bạn, vì vậy bạn có thể tìm hiểu trạng thái của các đối tượng được đề cập đến.

55

Như Marc chỉ ra, bạn có thể sử dụng tham chiếu đến đối tượng OBJC không được khởi tạo bên ngoài phạm vi mục tiêu-c.

Dưới đây là một mẫu làm việc mã C gọi phương thức một đối tượng của ObjC:

#import <Cocoa/Cocoa.h> 

id refToSelf; 

@interface SomeClass: NSObject 
@end 

@implementation SomeClass 
- (void) doNothing 
{ 
     NSLog(@"Doing nothing"); 
} 
@end 

int otherCfunction() 
{ 
     [refToSelf doNothing]; 
} 


int main() 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    SomeClass * t = [[SomeClass alloc] init]; 
    refToSelf = t; 

    otherCfunction(); 

    [pool release]; 
} 
+2

dude, bạn đá. Tôi lãng phí một ngày tốt đẹp về điều này và mã của bạn chỉ được cứu vãn một ngày khốc liệt khác. Tôi ước tôi có thể upvote bạn 100 lần nữa. – eviljack

+1

Một 100 upvotes khác từ tôi! Điều này cực kỳ hữu ích. – willc2

+1

BTW điều này sẽ chỉ làm việc cho một singleton. Nếu bạn khởi tạo nhiều hơn một đối tượng mà con trỏ refToSelf sẽ chỉ trỏ đến đối tượng cuối cùng. – Brian

1

Breakpoint vào phương pháp trước khi xyz, và sau đó bắt đầu bước duy nhất trong chương trình gỡ rối. Tuyệt vời của nó bao nhiêu lỗi bạn có thể phát hiện bằng cách đơn bước qua mã trong trình gỡ lỗi. Trên thực tế, đây thực sự là kỹ thuật tránh lỗi được đề xuất để luôn thực hiện một bước thông qua mã cho bất kỳ mã mới nào mà bạn viết.

Tôi đồng ý với Marc, nguyên nhân cổ điển của "phương pháp đó và các phương pháp sau khi nó không được thực hiện" là tham chiếu đối tượng là không, vì [doilAnything] sẽ không làm gì và không báo cáo lỗi.

0

Có một cách đơn giản để làm điều này:

@implementation 
// Define a object 
ClassName *thisClass; 

và sau đó init với tự

thisClass = self; 

Bạn có thể sử dụng bất kỳ var và phương pháp trong C-Phương pháp

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