2010-09-10 21 views
5

Nếu hai Danh mục khác nhau có cùng phương pháp, thì một danh mục nào sẽ được gọi bởi hệ thống thời gian chạy C mục tiêu ??Nếu hai Danh mục khác nhau có cùng một phương pháp, thì một danh mục nào sẽ được gọi bởi hệ thống thời gian chạy mục tiêu C?

ví dụ:

@interface ClassA (MathOps) 
    -(void)CategoryMethod; 
@end 

@interface ClassA (MathOps1) 
-(void)CategoryMethod; 
@end 

@implementation ClassA(MathOps1) 
- (void) CategoryMethod{ 
    NSLog(@"Inside Category Method 2"); 
} 
@end 

@implementation ClassA(MathOps) 
- (void) CategoryMethod{ 
    NSLog(@"Inside Category Method 1"); 
} 
@end 

Bây giờ nếu tôi đang gọi điện thoại, [ObjClassA CategoryMethod] ;, Sau đó, mà người ta gọi là? Tại sao ?

Trả lời

4

Như @Dave DeLong nói, hành vi không xác định. Một trong những phương pháp sẽ "giành chiến thắng", và không có cách nào để biết cái nào. Nếu bất kỳ mã nào khác phụ thuộc vào phương pháp mất, bạn sẽ thấy mình gỡ lỗi một số lỗi tiềm ẩn. Tốt nhất để tránh tình hình tất cả cùng nhau. Đây là một vấn đề cụ thể khi thực hiện các phương thức trợ giúp "rõ ràng". Nếu các phương thức đó được thêm vào trong phiên bản khung tương lai, danh mục của bạn sẽ ghi đè phương thức mới trong lớp (nếu ở trong lớp chính) hoặc có thể ghi đè phương thức nếu phương thức được thêm vào danh mục. Eek.

Nhiều khung công tác Cocoa cung cấp các danh mục cho các lớp học hiện có (ví dụ: Cocoa) theo mô hình, theo đó họ thêm tiền tố lớp vào phương thức để giảm thiểu nguy cơ va chạm tên. Vì vậy, ví dụ: bạn sẽ tạo các danh mục như:

@interface NSObject (MyCategory) 
- (void)myprefix_categoryMethod; 
@end 
+6

+1, ngoại trừ tôi khuyên bạn nên sử dụng hậu tố thay vì tiền tố. Bằng cách đó bạn vẫn có thể sử dụng tính năng tự động hoàn tất mà không cần phải nhớ rằng phương thức bạn muốn thực sự là một phương pháp danh mục. –

8

Không xác định. Nó phụ thuộc vào thể loại nào được nạp đầu tiên bởi thời gian chạy, không có thứ tự tài liệu nào xảy ra.

Tóm lại: không làm điều này. :)

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