On Jun 25, 2008, at 9:49 PM, Tran Kim Bach wrote:

On Wed, Jun 25, 2008 at 3:36 PM, Ken Thomases <[EMAIL PROTECTED]> wrote


Also, in the pseudo-code you provide, the NSData objects will accumulate in the autorelease pool until some point after your "for" loop. You can try using an autorelease pool inside the loop so that the NSData objects are released after each iteration. You may just be exhausting memory. For the case where you're not using NSData, the memory exhaustion might not happen since you're not storing the data twice in memory (once in the handle, once
in the NSData), but would if there were twice as many resources.

Thanks Ken. I'm confusing that as the memory management rules say, I myself did not take the ownership of the NSData objects. So, I'm not responsible
for relinquishing ownership of them?

It is correct that you are not responsible for sending -release to the NSData object. However, you do need to understand the nature of autoreleased objects, the lifetime of autorelease pools, the fact that autoreleased objects accumulate in autorelease pools if you don't give the pools the opportunity to drain, and how to address that if it becomes a problem. The overview of the NSAutoreleasePool class reference says this:

If your application creates a lot of temporary autoreleased objects within the event loop, it may be beneficial to create local autorelease pools to help to minimize the peak memory footprint. You create an NSAutoreleasePool object with the usual alloc and init messages and dispose of it with release or drain (to understand the difference, see “Garbage Collection”). You should always drain an autorelease pool in the same context (invocation of a method or function, or body of a loop) that it was created. See Autorelease Pools <http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Concepts/AutoreleasePools.html > for more details and several code samples using autorelease pools.





I hope you can show me the way to get out of this problem. I'm totally new
to Programming in Mac OS.

       OSStatus error = noErr;

unsigned short pmResFile = 0;

NSString *resFile;

NSURL *url;

FSRef fsRef;

resFile = [textField stringValue]; // get resfile from a textField (for
example)

url = [NSURL fileURLWithPath:resFile];


CFURLGetFSRef( (CFURLRef)url, &fsRef);

(void)FSOpenResourceFile( &fsRef, 0, NULL, (SInt8)fsRdPerm, &pmResFile);

short saveRes = CurResFile();

if (pmResFile > 0)

{

int i = 0;

int count = 0;

ResType resType;

               NSString *typestr = [comboBox stringValue];

memcpy((char *)&resType, (char *)[typestr cStringUsingEncoding:
NSUTF8StringEncoding], 4);

The above is only correct for big-endian systems (PPC). Also, if the string is shorter than 3 characters, you'll access past then end of the character array.



UseResFile(pmResFile);

count = Count1Resources( resType );

for (i = 1; i <= count; i++)

{

long sizeLong;

short resIDShort;

NSString *name;

NSNumber *resID;

ResType resType1;

Str255 nameStr;

NSString *type;

Handle dataHandle;

NSData *data;

dataHandle = Get1IndResource( resType, i);

error = ResError();

if(error!=noErr)

{

NSLog(@"Reading resource error");

UseResFile(saveRes);

return;

}

GetResInfo(dataHandle, &resIDShort, & resType1, nameStr);

sizeLong = GetResourceSizeOnDisk(dataHandle);

You've been told to use GetHandleSize instead.



HLockHi( dataHandle );

name = [NSString stringWithCString:&nameStr[1] length:nameStr[0] ];

type = [NSString stringWithCString:(char *) & resType1 length:4];

Same endianness issue, in reverse.



data = [NSData dataWithBytes:*dataHandle length:sizeLong ];

       resID = [NSNumber numberWithShort:resIDShort];

if((type2 =='PREC')&&([resID intValue]== 302))

{

   struct PGControlRes pgControlRes;

memcpy(&pgControlRes,[data bytes], [data length]);

Have you tested that the resource size is the same as the structure size?



// more codes

}

HUnlock(dataHandle);

ReleaseResource(dataHandle);

}

UseResFile(saveRes);

}

CloseResFile(pmResFile);


Are you still getting an error?  If so, what error and where?

-Ken

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to