target-c Управление памятью объекта - PullRequest
1 голос
/ 12 сентября 2011

У меня есть этот простой класс, который, я знаю, в порядке утечек памяти.

   @interface location : NSObject {
        NSString *name;
        float lat;
        float lon;
        NSString *subtitle;
    }

    @property (nonatomic, retain) NSString *name;
    @property (nonatomic, retain) NSString *subtitle;
    @property (nonatomic, assign) float lat;
    @property (nonatomic, assign) float lon;


    @end

    @implementation location

    @synthesize name;
    @synthesize lon;
    @synthesize lat;
    @synthesize subtitle;

    -(void)dealloc{
        [name release];
        [subtitle release];
        [super dealloc];
    }

    @end

В @property есть сохранение, поэтому я освобождаю в методе dealloc.Теперь мой вопрос: если я выделю одну из строк в методе init или каком-либо другом методе, который я создаю, должен ли я сделать другую версию?Если да, то когда?

@implementation location

@synthesize name;
@synthesize lon;
@synthesize lat;
@synthesize subtitle;

-(void) init{
      name = [[NSString alloc] init];
 }

-(void)dealloc{
    [name release]; // IS THIS CORRECT?!
    [subtitle release];
    [super dealloc];
}

@end 

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Если вы присваиваете значение с использованием нотации self., то вам следует release (так как retain вызывался автоматически, если вы используете synthesize), если вы использовали alloc + init подход для создания нового объекта.Пример:

NSString *str = [[NSString alloc] init];
self.name = str;
[str release];

Если вы присваиваете значение с использованием нотации self. и присваиваете автоматически освобожденный объект, тогда вам не следует retain и release.Пример:

NSString *str = [NSString string];
self.name = str;

Если вы присваиваете значение без префикса self., вам не следует присваивать autorelease объект и не следует release, вам просто нужно alloc + init объект.Пример:

NSString *str = [[NSString alloc] init];
name = str;

Или, если вы хотите assign автоматически освобождать объект без префикса self., вы должны сохранить его.Пример:

NSString *str = [NSString string];
name = [str retain];

В методе dealloc вы должны release objects, если вы не делали этого раньше.

0 голосов
/ 13 сентября 2011

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

, пока вы не вызовете self.name, семантика сохранения не применяется.

Существует стиль кода, который устраняет эту путаницу,не меняйте имя свойства и имя экземпляра и присвойте имя экземпляру имени свойства в @ synthesize.

Примерно так:

@interface location : NSObject {
    NSString *name;
 }

 @property (nonatomic, retain) NSString *nameProp;


 @end

@implementation location

@synthesize nameProp = name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...