Following is my code(with some unrelated thing omitted):
@implementation HomeSceneController
...
@synthesize options = _options; // _options is a NSArray object with 4 elements
- (id)init
{
if (self = [super initWithNibName:@"HomeScene" bundle:nil]) {
_currentOptionIndex = 0;
// Following code add two key event observations, when up arrow or down arrow key is pressed, the corresponding function will be fired.
[self addObservation:_KEY_UPARROW_ selector:@selector(UpArrowPressHandler)];
[self addObservation:_KEY_DOWNARROW_ selector:@selector(DownArrowPressHandler)];
}
return self;
}
- (void)loadView {
[super loadView];
// init _options
_options = [NSArray arrayWithObjects:
_localGameOption,
_networkGameOption,
_controlSettingOption,
_quitOption,
nil];
[self selectOption:_localGameOption];
}
....
// in these two functions, _options become nil! I don't know why...
- (void)UpArrowPressHandler {
if (_currentOptionIndex > 0) {
[self deselectOption:_options[_currentOptionIndex]];
_currentOptionIndex--;
[self selectOption:_options[_currentOptionIndex]];
}
}
- (void)DownArrowPressHandler {
if (_currentOptionIndex < 3) {
[self deselectOption:_options[_currentOptionIndex]];
_currentOptionIndex++;
[self selectOption:_options[_currentOptionIndex]];
}
}
@end
when I press up arrow key, the UpArrowPressHandler function is fired. However, the problem is, the _options array become nil.
Can anyone tell me why and how to fix it?
//===========================================================================================
Additional problem:
In the following program:
import "Deep.h"
@implementation Deep
- (id)init {
if (self = [super init]) {
_name = @"Deep";
}
return self;
}
- (void)test {
NSLog(_name);
}
@end
The test method can correctly print “Deep” when I call it somewhere else.
However, according to @ATaylor’s explanation, _name should be released.
So, where is my problem?
That’s because _options is getting assigned an autoreleased object, which gets released once you leave the method it was called from.
Try assigning it to ‘self.options’, which will (most likely) call ‘retain’ on the object, or call ‘retain’ explicitly.
Once more in code:
Either use:
Or:
Please don’t forget to release your ‘options’, once you’re done with it, either by:
or:
Please only go for ONE of these options, because otherwise you’ll get weird behaviour with the retain count.
You see, Apple gives us a number of ‘convenience functions’, which return autoreleased objects, meaning we don’t have to bother with their release.
As a general rule of thumb:
Call release for every alloc/retain you call yourself.
To answer the second question:
is an assignment to a variable, equivalent to ‘const char *_name = “Deep”;’ from C.
There is no need to release that, for the simple reason, that you didn’t create or retain it. (No new, No alloc, no retain, no copy).
The object will not get autoreleased either, because you didn’t call any sort of method, which would cause the variable to be autoreleased.
Also, see this answer, which deals with the exact problem.
Just for clarification, to get a string, there are three types of methods.