2012-09-10 27 views
10

Tôi có một lớp học loại NSString (NSString+URLEncoding.h). Tôi đang gặp phải sự cố chọn bộ chọn không xác định, bởi vì chuỗi tôi đang gọi phương thức danh mục đã được tối ưu hóa thành một NSCFConstantString bởi iOS.iOS 5: Tạo danh mục NSString bao gồm NSCFConstantString?

-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174 

Tôi đã học được của NSCFConstantString vs NSCFString tối ưu hóa trong iOS 5 từ: http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

Có ai biết làm thế nào tôi có thể nhận được các loại NSString để bao gồm các chuỗi liên tục hoặc thậm chí buộc các var là an NSString/NSCFString và không phải là NSCFConstantString?

Chúc mừng, Z

-edit-

  • Linker cờ -ObjC -all_load đều đã thực hiện
  • NSString + URLEncoding.m được bao gồm trong các chỉ tiêu biên dịch nguồn
  • NSString + URLEncoding. m thực hiện phương thức URLEncodedString.
  • Đã kiểm tra zombie.

Tôi thêm một dịch vụ chia sẻ để ShareKit 2.0

tiêu đề:

@interface NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString; 

thực hiện:

@implementation NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString 
{ 
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                      (CFStringRef)self, 
                      NULL, 
                      CFSTR("!*'();:@&=+$,/?%#[]"), 
                      kCFStringEncodingUTF8); 
    [result autorelease]; 
    return result; 
} 
+0

có được giải quyết không? nếu không phải như vậy, sau đó tôi có thể cố gắng giải quyết nó nếu bạn cần? –

+0

Điều '__NSCFConstantString' trong blog bạn đã liên kết là cá trích đỏ.Vấn đề trong blog không liên quan gì đến việc phân lớp và mọi thứ cần làm với thực tế là Apple cố gắng tối ưu hóa tất cả các chuỗi rỗng thành một đối tượng. Nếu một đối tượng đại diện cho một chuỗi rỗng là một 'NSString' đơn giản thì mã của blog sẽ vẫn bị hỏng. – JeremyP

Trả lời

11

Có vấn đề với trình liên kết có thể làm cho mã chết của nó loại bỏ hoàn toàn bất kỳ tệp đối tượng nào chỉ chứa các danh mục obj-c (hoặc không được tham chiếu). Về mặt lý thuyết, hãy chuyển cờ -ObjC tới trình liên kết nên sửa lỗi này, nhưng điều đó dường như không hoạt động. Bạn có thể khắc phục sự cố này bằng cách cung cấp cờ liên kết -all_load, điều này sẽ làm cho trình liên kết luôn liên kết trong tất cả các tệp đối tượng.

Lưu ý rằng bạn có thể phải đặt -all_load cho dự án gốc nếu danh mục của bạn là một phần của tiểu dự án hoặc thư viện mà bạn bao gồm ở đâu đó.

+0

đã được chỉnh sửa, bạn có thể xem lại không? –

+0

Chính xác, điều này phù hợp với tôi. Cảm ơn bạn ... :) –

2

__NSCFConstantString là một lớp con của NSString, vì vậy bất kỳ loại trên NSString áp dụng đến __NSCFConstantString.

Hoặc bạn không liên kết trong danh mục của mình hoặc danh mục của bạn không xác định phương thức URLEncodedString trong @implementation.

+0

đã được chỉnh sửa, bạn có thể xem lại không? –

4

Chỉ cần dành 30 phút để tìm ra chính xác cùng một vấn đề. Sau khi không có mối liên hệ với tôi, tôi phát hiện ra rằng danh mục không có trong Danh sách các nguồn biên dịch trong mục tiêu của tôi là Giai đoạn xây dựng. Hãy chắc chắn kiểm tra xem nó có ở đó không.

+0

Đặc biệt khi bạn có nhiều mục tiêu, nếu bạn quên thêm tệp mới được thêm vào nhiều mục tiêu, điều này có thể gây ra sự cố này. – UnchartedWorks

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