2012-05-07 27 views
13

Tôi không thể tìm thấy điều này ở bất cứ nơi nào, vì vậy tôi yêu cầu chỉ cần yêu cầu để đảm bảo. Và có, tôi biết cơ bản của nó, nhưng tôi hình tôi muốn có được điều đó ngay trước khi tôi phạm sai lầm một triệu lần:Thêm số nguyên vào NSMutableArray

Nếu tôi làm như sau, nó sẽ gán "0" vào NSNumber theo mặc định (nếu không, loại đối tượng là nó), hoặc tôi sẽ phải làm mã thứ 2?

(Hoặc cả hai điều này có thể sai đối với những gì tôi đang cố gắng làm. Nếu có, hãy cho tôi biết. Cả hai đều biên dịch nên tôi tự hỏi cái nào là "đúng" (hoặc được ưa thích) và tại sao.)

Mã 1:

NSMutableArray array = [[[NSMutableArray alloc] init]]; 
[array addObject: 0]; 

Mã 2:

NSMutableArray array = [[NSMutableArray alloc] init]; 
[array addObject: [NSNumber numberWithInt: 0]]; 

Trả lời

21

NSMutableArraykhông mất loại nguyên thủy.

Tùy chọn thứ hai là chính xác.

+0

Được rồi. Cảm ơn bạn!! Tôi sẽ sớm coi đây là câu trả lời đúng (nói rằng tôi phải đợi 10 phút để chấp nhận câu trả lời cho câu hỏi này) – MrHappyAsthma

+1

Tôi rất vui vì tôi đã có thể giúp đỡ. –

6

Bạn không thể đặt một nguyên thủy như một int thành một NSArray; bạn phải tạo một cá thể NSNumber để giữ nó.

Nếu tôi làm như sau, hiện nó cast "0" đến một NSNumber theo mặc định (nếu không muốn nói, loại đối tượng là nó)

Không đúc diễn ra. Nó không thể chỉ đơn giản là "đúc" một nguyên thủy vào một đối tượng, và nguyên thủy không có một loại đối tượng. Đối tượng phải được xây dựng bằng cách gửi tin nhắn (ngoại trừ: xem bên dưới), điều này xảy ra khi chạy; chỉ đúc có hiệu lực trong quá trình biên dịch.

Lý do duy nhất làm việc này là bạn đã chọn 0 để thêm vào mảng. Đây là giá trị giống như nil, viết tắt của "no object". Nếu bạn đã chọn bất kỳ số nguyên nào khác, bạn sẽ gặp sự cố khi bạn chạy mã, vì giá trị sẽ được sử dụng làm con trỏ tới bộ nhớ không chứa đối tượng hợp lệ.

Điều thú vị là, bắt đầu với Clang 3.1 hoặc LLVM 4.0 của Apple, * có some new syntatical sugar để tạo đối tượng từ chữ trong mã. Chúng tôi luôn có chữ số NSStrings: @"Lichtenstein". Với trình biên dịch mới, các đối tượng khác cũng có thể được tạo ra bằng cách sử dụng ký tự @.

Trong trường hợp này, để tạo ra một đối tượng NSNumber từ một số nguyên theo nghĩa đen, bạn chỉ có thể viết:

[array addObject:@0]; 

* (chưa có sẵn trong Xcode công cộng)

0

Như đã trình bày bởi các câu trả lời trước, bạn chỉ có thể thêm các đối tượng (loại id) vào các lớp chứa như NSArray.

Một lớp có thể hữu ích trong ngữ cảnh này là NSValue, hoạt động như một vùng chứa cho các kiểu dữ liệu không đối tượng của C và mục tiêu-C.Ngoài các kiểu dữ liệu số, điều này cũng có thể chứa các cấu trúc và một số kiểu dữ liệu nguyên thủy mục tiêu-C như NSRect.

Xem tại đây để biết thêm chi tiết: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html

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