Я думаю, что только треть переменных должна быть освобождена в методе dealloc. Это верно?
// no. your dealloc should look like this:
- (void)dealloc {
// note: *not* using accessors in dealloc
[view release], view = nil;
[scopeBar release], scopeBar = nil;
[array release], array = nil;
[super dealloc];
}
// your assignment of `scopeBar` should look like this:
...
self.scopeBar = (UISegmentedControl *)subView;
...
// you want to retain the view, as advertised.
// consider avoiding an ivar if you can easily access it.
// your assignment of `view` should look like this:
...
self.view = theView;
...
// you want to retain the view, as advertised.
// consider avoiding an ivar if you can easily access it.
// your assignment of `array` should look like this in your initializer:
// note: *not* using accessors in initializer
...
// identical to `array = [[NSMutableArray alloc] init];`
array = [NSMutableArray new];
...
// and the assignment of `array` should look like this in other areas:
...
self.array = [NSMutableArray array];
...
// you're likely to be best suited to declare your array as
// follows (assuming you really need a mutable array):
...
NSMutableArray *array; // << the declaration of the ivar
...
...
// the declaration of the public accessors.
// note the array is copied, and passed/returned as NSArray
@property (nonatomic, copy) NSArray *array;
...
// finally, the implementation manual of the properties:
- (NSArray *)array {
// copy+autorelease is optional, but a good safety measure
return [[array copy] autorelease];
}
- (void)setArray:(NSArray *)arg {
NSMutableArray * cp = [arg mutableCopy];
// lock? notify?
NSMutableArray * prev = array;
array = cp;
[prev release], prev = nil;
// unlock? notify? update?
}
другие ответы предполагают, что висячие указатели (например, вы все еще держите указатель для просмотра, хотя вид мог измениться за вашей спиной) являются допустимыми.
они не должны быть разрешены в реальных программах. они чрезвычайно опасны, и может быть очень трудно воспроизвести ошибки, которые они вызывают. следовательно, вы должны убедиться, что у вас есть ссылка на указатели, которые вы поддерживаете / удерживаете.
Вы также должны использовать средства доступа в общедоступном интерфейсе ради подкласса - в случае, если они переопределяют их. если вы не хотите разрешать / поддерживать это, рассмотрите возможность использования закрытой переменной.