Интересно о выпуске переменных - PullRequest
1 голос
/ 17 марта 2011
UIView *view; //1

UISegmentedControl *scopeBar; //2

NSMutableArray *array; //3

@property (nonatomic, retain) IBOutlet UIView *view;

@property (nonatomic, retain) UISegmentedControl *scopeBar;

@property (nonatomic, retain) NSMutableArray *array;

.m

@synthesize view, scopeBar, array;

    for (id subView in [view subviews]) {
        if ([subView isMemberOfClass:[UISegmentedControl class]]) {
            scopeBar = (UISegmentedControl *)subView;
        }
    }

array = [[NSMutableArray alloc] init];

- (void)dealloc {
}

Я думаю, что только треть переменных должна быть освобождена в методе dealloc. Это верно?

Ответы [ 5 ]

0 голосов
/ 17 марта 2011

Я думаю, что только треть переменных должна быть освобождена в методе 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?
}

другие ответы предполагают, что висячие указатели (например, вы все еще держите указатель для просмотра, хотя вид мог измениться за вашей спиной) являются допустимыми.

они не должны быть разрешены в реальных программах. они чрезвычайно опасны, и может быть очень трудно воспроизвести ошибки, которые они вызывают. следовательно, вы должны убедиться, что у вас есть ссылка на указатели, которые вы поддерживаете / удерживаете.

Вы также должны использовать средства доступа в общедоступном интерфейсе ради подкласса - в случае, если они переопределяют их. если вы не хотите разрешать / поддерживать это, рассмотрите возможность использования закрытой переменной.

0 голосов
/ 17 марта 2011

Вопреки некоторым ответам, вы также должны освободить свой выход (view), причем не только в dealloc, но и в viewDidUnload, проще всего установить его в nil:

self.view = nil;

Также обратите внимание, что если вы не обращаетесь к своим свойствам, но к своим переменным экземпляра (т.е. без префикса self.), ваш атрибут retain не поможет вам, и вы не сохраните объект. Это означает, что как только scopeBar будет удалено из подпредставлений view, оно будет освобождено, и вы получите доступ к зомби.

Как правило, лучше использовать средство доступа к свойствам везде, кроме методов init, чтобы вам не приходилось иметь дело с управлением памятью в явном виде. Установка их на nil в dealloc и viewDidUnload в случае розеток должна быть достаточной.

Кроме того, не делайте того, что предложил Дженифер, и после того, как вы назвали релиз для переменной, не устанавливайте для свойства значение nil, это переиздаст его.

0 голосов
/ 17 марта 2011

И я думаю, что в этом вопросе вы найдете хорошие предложения по поводу вашего запроса

Почему мы должны выпустить?

0 голосов
/ 17 марта 2011

Поскольку я думаю, что вы должны освободить и установить их nil, потому что вы сделали их свойства, сделайте это: -

в вашем распоряжении

[array release];
self.array=nil;
self.scopeBar=nil;
self.view=nil;
0 голосов
/ 17 марта 2011

Да, (array необходимо освободить), потому что вы alloc это. Таким образом, программист обязан выпустить его. Итак -

- (void)dealloc {

    [ array release ] ;
    // Any other resources alloc, init, new should be released
}

Для получения дополнительной информации о том, что выпуск , Управление памятью - ObjectiveC

...