Parsing through this document on class clusters, NSNumber implements initWithChar: in roughly the following manner:
- (id)initWithChar:(char)c
{
[self release];
return [[__NSCharNumber alloc] initWithChar:c];
}
Similarly, you could use this pattern for initializing views from a Nib:
- (id)initWithFrame:(CGRect)frame
{
id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0];
realSelf.frame = frame;
[self release];
return realSelf;
}
I'm wondering, does ARC manage the releasing of the unreturned self in these cases? Is it documented anywhere?
Found the details in the clang documentation.
initimplicitly uses the__attribute__((ns_consumes_self))attribute, meaning that whileselfis defined as__strong id self, the initial assignment does not perform a retain. This means as soon asselfis reassigned or the function terminates,selfwill be released using standard strong rules.To get an +1 out, there is an implicit
__attribute((ns_returns_retained))which prevents the returned object from being released at the end.At a high level, ARC plans to release the initial value of
selfone extra time by the end of the function, while also retaining the return value, maintaining its +1 output.