2012-03-27 24 views
6

Giả sử tôi có ứng dụng Mac hoặc iOS dựa trên Cocoa. Tôi muốn chạy một phân tích tĩnh trên mã nguồn ứng dụng của tôihayứng dụng của tôi nhị phân để lấy một danh sách tất cả các phương pháp Objective-C gọi đó. Có một công cụ có thể làm điều này?Làm thế nào để tĩnh tất cả các phương pháp ObjC gọi là trong một ứng dụng Cocoa?

Một vài điểm:

  1. Tôi đang tìm kiếm một giải pháp tĩnh. Tôi không tìm kiếm dynamic solution.

  2. Nội dung nào đó có thể chạy với mã nhị phân hoặc mã nguồn có thể chấp nhận được.

  3. Lý tưởng nhất là sản lượng sẽ chỉ được một de-bị chúng lừa bịp danh sách lớn của các phương pháp Objective-C như:

     
    … 
    -[MyClass foo] 
    … 
    +[NSMutableString stringWithCapacity:] 
    … 
    -[NSString length] 
    … 
    
    (Nếu nó không bỏ lừa đó là mát mẻ)

  4. Nếu các loại ký hiệu (chức năng C, tĩnh vars, vv) có mặt, đó là tốt.

  5. Tôi quen thuộc với class-dump, nhưng AFAIK, nó bãi tuyên bố Lớp trong hệ nhị phân, không phải là gọi là phương pháp của bạn trong nhị phân của bạn. Đó không phải là những gì tôi đang tìm kiếm. Nếu tôi sai, và bạn có thể thực hiện việc này bằng cách đổ lớp, hãy sửa tôi.

  6. Tôi không hoàn toàn chắc chắn điều này là khả thi. Vì vậy, nếu nó không phải, đó là một câu trả lời tốt quá. :)

Trả lời

9

Gần nhất tôi biết là otx, mà là một wrapper quanh otool và có thể tái tạo lại công cụ chọn ở objc_msgSend() các trang web gọi.

http://otx.osxninja.com/

+0

Con trỏ tuyệt vời, cảm ơn bbum! –

+1

Miền không còn tồn tại nữa. http://web.archive.org/web/20130929164302/http://otx.osxninja.com/ từ lưu trữ dot org. – Klaas

0

Một công cụ tuyệt vời là class-dump mà luôn lựa chọn đầu tiên của tôi để phân tích tĩnh.

+0

Xin lỗi, tôi không đọc câu hỏi của bạn đúng cách ... – Chris

7

Nếu bạn đang yêu cầu tìm một danh sách COMPLETE của tất cả các phương pháp được gọi thì điều này là không thể, cả tĩnh và động. Lý do là các phương pháp có thể được gọi theo nhiều cách khác nhau và thậm chí được lắp ráp động và lập trình.

Ngoài lời gọi phương thức thông thường bằng cách sử dụng các thông điệp Mục tiêu-C như [Object message], bạn cũng có thể gửi thư bằng các hàm C-API từ objc/message.h, ví dụ: objc_msgSend(str, del). Hoặc bạn có thể gửi chúng bằng cách sử dụng API NSInvocation hoặc với performSelector:withObject: (và các phương pháp tương tự), xem examples here. Các bộ chọn được sử dụng trong tất cả các trường hợp này có thể là các chuỗi tĩnh hoặc thậm chí chúng có thể được xây dựng theo chương trình từ các chuỗi, sử dụng những thứ như NSSelectorFromString.

Để làm cho vấn đề tồi tệ hơn, Objective-C thậm chí còn hỗ trợ dynamic message resolution cho phép đối tượng phản hồi các thư không tương ứng với các phương pháp!

Nếu bạn chỉ hài lòng với các lời gọi phương thức cụ thể thì việc phân tích cú pháp mã nguồn cho các mẫu được liệt kê ở trên sẽ cung cấp cho bạn danh sách tối thiểu các phương thức có thể được gọi trong khi thực thi. Nhưng danh sách có thể không đầy đủ (tức là, không chứa các phương thức có thể được gọi) cũng như quá đầy đủ (tức là, có thể chứa các phương thức không được gọi trong thực tế).

+0

Tôi thích câu trả lời này rất nhiều. Bạn nâng cao một điểm cực kỳ quan trọng: Không có giải pháp tĩnh nào có thể đảm bảo mức độ phù hợp 100% do các tính năng ngôn ngữ/thời gian chạy ObjC mà bạn đã đề cập. Tuy nhiên, tôi sẽ để câu hỏi của tôi đứng yên, vì tôi nghĩ rằng vẫn có giá trị trong một công cụ có thể tìm thấy phần còn lại. –

+3

Tôi nghĩ rằng lớn hơn tất cả sự kỳ quặc lập trình meta là vấn đề không biết các loại của người nhận tại thời gian biên dịch, điều này là cần thiết để xác định phương thức nào được gọi. Khi tôi viết '[foo length]', bạn không biết nếu đó là '- [NSString length]', '- [FootballField length]' hoặc '+ [SomePoorlyDesignedClass length]' - nó có thể là bất kỳ sự kết hợp nào của ba tại thời gian chạy hoặc thậm chí một số phương thức khác được tải từ plugin. Vì vậy, bạn có thể xác định với độ trung thực khá cao những gì * tin nhắn * được gửi đi, nhưng nó là nhiều iffy cố gắng để nói những gì * phương pháp * được gọi là kết quả. – Chuck

+0

@Chuck Điểm tốt. Nó không chỉ là các bộ chọn, mà còn là các đối tượng có thể được xây dựng một cách năng động. +1 cũng chỉ ra sự tinh tế về các phương thức lớp và ví dụ! – user8472

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