• 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: Is ARC any smarter than Xcode's 'Analyze'?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Is ARC any smarter than Xcode's 'Analyze'?


  • Subject: Re: Is ARC any smarter than Xcode's 'Analyze'?
  • From: Quincey Morris <email@hidden>
  • Date: Mon, 12 Nov 2012 10:31:10 -0800

On Nov 12, 2012, at 09:19 , Jerry Krinock <email@hidden> wrote:

> I'm debugging a crash in a large project which evidence indicates is caused by a retain/release imbalance.  The project is written with manual retain/release, not ARC.
>
> The project is built in Xcode 4.5.2, and when I 'Analyze', I get no warnings pertaining to memory management.  So the problem must be some edge case which is not caught by 'Analyze'.  Further, I think that ARC is built upon 'Analyze', and therefore if I converted this project to ARC, it would still crash.
>
> Am I correct?

I don't think so. The analyzer is only able to detect retain/release problems basic on a *static* analysis of the source code (supplemented perhaps by guesses about what certain code patterns suggest about run-time behavior). Committing a memory management error is hardly an edge case -- it's ridiculously easy to do. In particular, the analyzer doesn't cross file boundaries, so a retain in one file that's supposed to be matched by a release in another file isn't something the analyzer can detect.

ARC works by propagating correctness. It implements correct memory management in each local scope, and follows correctness-preserving rules when transitioning into and out of scopes. In theory, if you follow ARC's rules, you can't write code with incorrect memory management. So, converting the project to ARC may very well solve the problem. In practice, the only real danger points are bridging points into and out of ARC control, and a very small number of cases where ARC deliberately doesn't preserve 100% correctness.

For example, ARC doesn't fully manage the 'self' pointer, for performance reasons. You can write code like this:

		…
		someObjectInAnIvar = …
		[someObjectInAnIvar dontDoThisAtHome];
		…

	- (void) dontDoThisAtHome {
		someObjectInAnIvar = nil;
		…
	}

Assuming there's no other reference keeping the object alive, then it will get dealloc'ed in 'dontDoThisAtHome', immediately invalidating 'self'.

This example came up on one of the lists a few months ago, because if the ivar happens to be __weak, then counterintuitively ARC throws incaution to the winds and safely retains the object for the length of the method invocation.
_______________________________________________

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: [YES] Is ARC any smarter than Xcode's 'Analyze'?
      • From: Jerry Krinock <email@hidden>
References: 
 >Is ARC any smarter than Xcode's 'Analyze'? (From: Jerry Krinock <email@hidden>)

  • Prev by Date: Re: Is ARC any smarter than Xcode's 'Analyze'?
  • Next by Date: Re: [YES] Is ARC any smarter than Xcode's 'Analyze'?
  • Previous by thread: Re: Is ARC any smarter than Xcode's 'Analyze'?
  • Next by thread: Re: [YES] Is ARC any smarter than Xcode's 'Analyze'?
  • Index(es):
    • Date
    • Thread