2009-10-06 35 views
7

Khi tôi cố in giá trị số nguyên vào bàn điều khiển được truy xuất từ ​​NSManagedObject, nó hiển thị giá trị 6 hoặc 8 chữ số (ID đối tượng?). Tuy nhiên, nếu tôi sử dụng trình gỡ lỗi 'Mô tả in cho Bảng điều khiển' sẽ hiển thị dưới dạng giá trị chữ số duy nhất tôi mong đợi.Cách in giá trị NSInteger từ NSManagedObject bằng NSLog

Ví dụ, tôi gán đối tượng 'chuỗi' đến một NSInteger và sau đó hiển thị cách sử dụng một định dạng chuỗi NSLog:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 
NSLog(@"sequence = %d",myProcess.sequence); 

điều khiển đầu ra là:

2009-10-06 16:11:05.871 MyProcess[33185:20b] sequence = 565256 

Nhưng khi tôi cố gắng 'Print đến Bảng điều khiển 'từ trình gỡ lỗi, tôi thấy giá trị 1:

<MyStoryImage: 0x3f59a80> (entity: MyObject; id: 0x3f2d540 <x-coredata://FF21959A- 4B67-4587-A25F-66A7B8139DFA/MyProcess/p2> ; data: { 
sequence = 1; 
<x-coredata://FF21959A-4B67-4587-A25F-66A7B8139DFA/MyProcess/p1>; 
}) 

Trợ giúp của bạn được đánh giá cao!

Trả lời

11

Những gì bạn nhận được từ NSManagedObject của bạn sẽ là một NSNumber, tôi nghĩ vậy. Thật dễ dàng để in rằng:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %@", myProcess.sequence); 

hoặc, nếu bạn thực sự cần NSInteger:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %i", [myProcess.sequence integerValue]); 

Tôi nghĩ rằng trong bit mã này

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 

sự (NSInteger) myProcess do đó thực sự nhận được địa chỉ bộ nhớ của NSNumber. Bạn không thể bỏ một NSNumber vào NSInteger.

+0

Cảm ơn! điều này (cùng với lời giải thích của Chuck về% @ ở trên) cả hai đều cho tôi biết những gì tôi đã làm sai và cách khắc phục nó. – dfdumaresq

-1

NSInteger chỉ là một int:

typedef int NSInteger; 

Trong dòng đầu tiên của bạn mã:

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)sequence] intValue]; 

Tất cả các bạn đang làm là gán chuỗi với chính nó, trong một vòng khoảng cách. Và vì nó không được khởi tạo, nó có thể là bất kỳ số ngẫu nhiên nào.

+0

NSInteger không phải lúc nào cũng một int. Trong các ứng dụng 64 bit, nó dài. –

+0

Xin lỗi, ví dụ ban đầu đã bị thiếu sót. Tôi đã làm cho nó rõ ràng (er) rằng trình tự là một tài sản của một MyProcess. – dfdumaresq

0

Tùy thuộc vào cách ứng dụng được tạo, NSInteger có thể là 32 bit hoặc có thể là 64 bit. Nếu đó là giá trị 64 bit, bạn sẽ cần phải thực hiện

NSLog(@"sequence = %qi", sequence) 

để nó xử lý chính xác sequence dưới dạng giá trị 64 bit. Tuy nhiên, lưu ý rằng điều này sẽ không hoạt động đối với các ứng dụng 32 bit; theo như tôi biết, không có trình định dạng định dạng duy nhất nào sẽ hoạt động để in NSInteger trong cả thế giới 32 bit và 64 bit.

1

Có vẻ như myProcess.sequence là một NSNumber (đối tượng) chứ không phải là NSInteger (vô hướng). Điều đó sẽ giải thích tại sao nó hiển thị chính xác trong mô tả của đối tượng nhưng không phải khi bạn cố gắng in nó như một số nguyên một cách rõ ràng.

+0

Có, đó là một NSNumber (như được khai báo bởi CoreData), và tôi cho rằng câu trả lời cho câu hỏi của tôi ...Tôi đã nhầm lẫn vì các thuộc tính NSString có thể được in mà không có bất kỳ phiền toái nào, nhưng có lẽ có một số công việc bổ sung được thực hiện bởi trình định dạng chuỗi ("% @"). Cảm ơn! – dfdumaresq

+0

Trình chỉ định '% @' chỉ ra một đối tượng - đối tượng bất kỳ. Bạn cũng có thể in NSNumber theo cách đó. Ví dụ: 'NSLog (@"% @,% @,% @! ", [Số NSNumberWithInt: 1], [Số NSNumberWithInt: 2], [Số NSNumberWithInt: 3])' sẽ ghi "1, 2, 3! ". Nó hoạt động bằng cách gọi phương thức 'description' của đối tượng. Trình chỉ định '% d' dành cho ints. – Chuck

+0

Cảm ơn vì điều này! – dfdumaresq

-1

Hãy thử điều này:

NSLog(@"sequence = %li",(unsigned long)myProcess.sequence); 
+2

xin vui lòng cải thiện câu trả lời của bạn với một số lời giải thích, espacially so với câu trả lời khác mà ở đó đã – SBH

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