• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: nil there not here
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: nil there not here


  • Subject: Re: nil there not here
  • From: Dave Carrigan <email@hidden>
  • Date: Mon, 27 Jul 2009 15:33:33 -0700


On Jul 27, 2009, at 2:44 PM, David Blanton wrote:

		_myDocumentView = [[MyDocumentView alloc] init];
		[_myDocumentView retain];

You already own _myDocumentView by virtue of the fact that you used alloc/init, so this extra retain is going to lead to memory leaks unless you release twice in -dealloc (which obviously you don't want to do).


- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError

context = CGBitmapContextCreate (bitmap.m_array, bitmap.m_pixelsx, bitmap.m_pixelsy, 8, bitmap.m_pixelsx * 4, colorSpace, kCGImageAlphaNoneSkipFirst|kCGBitmapByteOrder32Host);
CGImageRelease(_myDocumentView->_cgImageRef);
_myDocumentView->_cgImageRef = CGBitmapContextCreateImage (context);
CGImageRetain(_myDocumentView->_cgImageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

You are treating _myDocumentView as a pointer to a struct. Since you declared as _cgImageRef as @public, it will work, it completely defeats the goal of encapsulation in the language, so you should have a good reason for doing it. If you can't think of a good reason, then instead you should set up getter and setter methods for these members:


- (void)setImage:(CGImageRef)image
{
  CFRetain(image);
  CFRelease(_cgImageRef);
  _cgImageRef = image;
}

- (CGImageRef)image
{
  return _cgImageRef;
}

An even better design would probably be to not even create getters and setters and create a method in your view such as

- (BOOL)setImageFromData:(NSData*)data type:(NSString*)type error: (NSError**)error
{
/* everything in -readFromData goes here
}


Then:

- (BOOL)readFromData:(NSData*)data ofType:(NSString*)typeName error: (NSError*)outError
{
return [_myDocumentView setImageFromData:data type:typeName error:outError];
}


It's hard to say without knowing your architecture if that's the better design, but it is definitely better if your view is the only thing that uses the imageref, especially since it completely hides the fact that your view uses CGImages and you are now free to use anything else that comes along without affecting the rest of your design.

As to why your ivar becomes nil, that's hard to say without seeing your entire project. But I suspect that if you start using better encapsulation and other OO principals in your design, your problem will disappear.

Regards,

--
Dave Carrigan
email@hidden
Seattle, WA, USA

Attachment: PGP.sig
Description: This is a digitally signed message part

_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:

This email sent to email@hidden

  • Follow-Ups:
    • Re: nil there not here
      • From: David Blanton <email@hidden>
References: 
 >nil there not here (From: David Blanton <email@hidden>)

  • Prev by Date: Re: [iPhone] Why can't a UITextField be its own delegate?
  • Next by Date: Re: nil there not here More Info
  • Previous by thread: Re: nil there not here More Info
  • Next by thread: Re: nil there not here
  • Index(es):
    • Date
    • Thread