Skip navigation.
 
mlRe: Is there a way to efficiently access NSArray element contents?
FROM : Joan Lluch (casa)
DATE : Sun Jun 08 20:51:25 2008

El 08/06/2008, a las 20:13, Brent Fulgham escribió:

> I've been enjoying the NSArray/NSMutableArray classes as I work with 
> various user interface features for a program I'm working on that 
> interacts with a legacy C++ library.
>
> I've recently begun considering how to efficiently display the 
> contents of a binary data stream.  Currently I'm appending to an 
> NSMutableArray of NSNumber objects, which is great for allowing me 
> to bind to some UI elements in close to real time and has provided a 
> simple and functional mechanism for text numerical display.
>
> Ideally, I'd like to be able to access a raw binary buffer of data 
> so I could for example bind it to something like an OpenGL vector 
> buffer for display.  However, unlike an STL vector, I don't think 
> the NS[Mutable]Array provides any guarantees of memory organization, 
> nor any way to 'unbox' the NSNumber to deal with the internal values.
>
> For example, in the STL, I could make use of the fact that the 
> vector template guarantees the storage to be in contiguous memory 
> and accessible as raw double values through the address of the first 
> element of the vector.  However, I don't think this is possible via 
> NSMutableArray and NSNumbers.
>
> Is my only option to periodically sync a buffer of binary double 
> values by copying from the NSMutableArray on some periodic basis?
>
> Thanks,
>
> -Brent
>



Since each item contained in an NSArray is a pointer to an object, you 
will not be able to retrieve them as raw data of different size even 
if the pointers in the NSArray were contiguous (which I believe they 
are)

Did you consider using a NSMutableData object (or even a CFMutableData 
for efficiency) instead?

You can use an intermediate (fixed length) C vector to receive the 
stream and transfer it in crunches to a CFMutableData object using the 
CFDataAppendBytes function. Then you can retrieve contiguous data of 
any length using the C pointer provided by CFDataBytePtr. However you 
will still have to transfer it to a NSArray to easily bind it to an 
user interface element such as a TableView.

I guess you will have to consider if you give priority to the ease of 
binding to the UI or to the ease of accessing arbitrary length values 
from the stream.

I would store the data in a CFMutableData object and then transfer it 
to a NSMutableArray when needed, not the other way round, but of 
course that depends on what you specifically want to achieve.

Related mailsAuthorDate
mlIs there a way to efficiently access NSArray element contents? Brent Fulgham Jun 8, 20:13
mlRe: Is there a way to efficiently access NSArray element contents? Jean-Daniel Dupas Jun 8, 20:29
mlRe: Is there a way to efficiently access NSArray element contents? Joan Lluch (casa) Jun 8, 20:51
mlRe: Is there a way to efficiently access NSArray element contents? Jean-Daniel Dupas Jun 8, 21:56