2009-03-11 34 views
7

Tôi chắc chắn tôi đang làm điều gì đó ngớ ngẩn, nhưng điều này khiến tôi phát điên.Số NSMutableArray luôn trả về số không

Tôi đang cố gắng lặp qua các kết quả cơ sở dữ liệu, tạo các đối tượng từ các kết quả đó và thêm các đối tượng vào NSMutableArray. Tôi đã xác minh qua NSLog thể gọi đó là dữ liệu đang được đọc một cách chính xác từ cơ sở dữ liệu và sao chép vào đối tượng, nhưng số lượng cho NSMutableArray luôn lợi nhuận 0.

Dưới đây là bản chất của mã:

while ([rs next]) { 

    Kana *htemp = [Kana alloc]; 

    htemp.content = [rs stringForColumn:@"hiragana"]; 
    [hiragana addObject:htemp]; 

} 
NSLog(@"Hiragana contains %d objects", [hiragana count]); 

Kana có nguồn gốc từ NSObject và hiragana là một thể hiện của NSMutableArray.

Tôi chắc chắn đây là lỗi của tân binh và tôi hy vọng ai đó có thể đặt tôi thẳng. TIA! :)

Trả lời

39

Đoán của tôi, đánh giá từ mã bạn đã đăng, là bạn có thể không phân bổ mảng của mình đúng cách. Khi tạo các đối tượng, bạn cũng cần phải khởi tạo chúng. Vì vậy, điều này:

Kana *htemp = [Kana alloc]; 

nên là:

Kata *temp = [[Kana alloc] init]; 

Tất cả các đối tượng cần phải được khởi tạo theo cách này. Vì vậy, nếu tôi là chính xác và bạn đã không được khởi tạo mảng của bạn, sau đó sáng tạo của bạn cần phải đi từ này:

NSMutableArray *hiragana = [NSMutableArray alloc]; 

này:

NSMutableArray *hiragana = [[NSMutableArray alloc] init]; 

Vì lý do tối ưu, bạn nên có lẽ cũng xác định công suất ban đầu cũng như nếu bạn có bất kỳ ý tưởng bao nhiêu đối tượng bạn có thể giữ:

[[NSMutableArray alloc] initWithCapacity:someNumber]; 
+0

câu trả lời của bạn là tốt - bạn cũng nên bao gồm lời khuyên được đề cập dưới đây để phát hành đối tượng htemp sau khi thêm nó vào mảng, hoặc người nào khác đó là một rò rỉ bộ nhớ lớn. – danielpunkass

+0

cảm ơn bạn vì câu hỏi và câu trả lời này ... nó giúp tôi như vậy! (n_n) –

0

Một vài điều:

  1. gì sẽ xảy ra nếu bạn đặt một cuộc gọi NSLog bên trong vòng lặp while? Xác minh rằng lặp vòng lặp thực sự xảy ra trước khi đổ lỗi cho nó trên mảng.
  2. Bạn tạo hiragana ở đâu? Nếu bạn đang làm nó không chính xác vì một lý do nào đó và mảng là không, nó có thể gây ra vấn đề như thế này.
  3. Nếu bạn không có bộ sưu tập rác, hãy đảm bảo [phát hành htemp] sau khi thêm nó vào vòng lặp. addObject giữ lại và mỗi mục được thêm sẽ bị rò rỉ từ vòng lặp. Một lần nữa, điều này chỉ có liên quan nếu thu gom rác bị tắt.

Rất có thể bạn không tạo mảng chính xác hoặc rs không chứa nội dung bạn mong đợi, và vì vậy [rs tiếp theo] không được gọi bao giờ (nếu rs là không, cho Ví dụ, không có vòng lặp nào của vòng lặp này sẽ thực hiện và bạn sẽ không có bất kỳ loại lỗi nào).

+0

Ahh ... đó là khởi tạo mảng sai FTW! :) Cảm ơn bạn! –

2

một nguyên nhân phổ biến (không phải trong trường hợp của bạn, khi nó quay ra, nhưng gener đồng minh) là quên thậm chí phân bổ mảng. Nếu bạn chưa tạo một mảng, bạn đang gửi thông báo count tới nil, vì vậy kết quả sẽ luôn là 0.

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