objective-c memory management memory management is semi-automatic: the programmer must allocate...

10
Objective-C Memory management Memory management is semi- automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly using a convenience constructor No need to de-allocate

Upload: heather-carter

Post on 05-Jan-2016

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Objective-C

Memory managementMemory management is semi-automatic:

The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly using a convenience constructor

No need to de-allocate

Page 2: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

AllocationAllocation happens through the class method alloc. The

message ‘alloc’ is sent to the class of the requested object. Alloc is inherited from NSObject. Every alloc creates a new instance (=object)

[HelloWorld alloc];The class creates the object with all zeros in it and

returns a pointer to it.HelloWorld *p = [HelloWorld alloc];The pointer p now points to the new instance.Now we send messages to the instance through p.

Page 3: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

The reference counter• Every instance has a reference counter. It counts

how many references are retaining the object. The counter is 1 after allocation. It does not count how many references exist to the object

• Sending the retain message to the object increases the reference counter by 1.

• Sending the release message decreases the reference counter by 1.

• No need to do either if using ARC.

Page 4: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

reference counter = retain counter

• When the reference counter reaches zero, the object is automatically de-allocated. The programmer does not de-allocate.

• The programmer only does:allocretainrelease

Page 5: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Rules for memory management• With no ARC: The method that does an alloc

or a retain must also do a release, it must maintain the balance between:

(alloc or retain) and (release)

• If a method does alloc and returns a pointer to the created object then the method must do an autorelease instead of release.

Page 6: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Autorelease pool• With no ARC: For outorelease to work the

programmer must create an autorelease pool, using:

NSAutoreleasePool *pool

= [[NSAutoreleasePool alloc] init];

• When Cocoa is used then the autorelease pool is created automatically – the programmer does not need to do it.

• To release the pool and all objects in it, do: [pool release];

Page 7: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Convenience Constructors• This is a class method that allocates and

initializes an object. The programmer is neither doing alloc nor init.

• Example:

+(id)studentWithName :(NSString*)name AndGpa:(float)gpa

{

id newInst = [[self alloc]initStudent:name :gpa];

return [newInst autorelease];

}

Page 8: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Convenience Constructors

• Essential: the method sends alloc to self which is the Student class object

• Essential: the method autoreleases the instance, because it returns a pointer to the created instance

• Not essential: This example uses an existing initializer, it could use something else or initialize the Student data directly

Page 9: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

Convenience Constructors

Calling the convenience constructor:id stud

= [Student studentWithName:@"Johnnie" AndGpa: 3.8];

The message is sent to the Student class object and returns a pointer to it, the pointer is assigned to stud

The calling code does neither alloc nor initAn autorelease pool must be in place

Page 10: Objective-C Memory management Memory management is semi-automatic: The programmer must allocate memory for objects either a) explicitly (alloc) or b) indirectly

End of Memory

With newer versions of Xcode, the memory management is becoming more and more automatic.

Use Automatic Reference Counting ARC to take advantage of the latest changes and improvements with memory management!