новое открытие сохранить или мое недоразумение? - PullRequest
1 голос
/ 24 сентября 2011
@interface DataMode : NSObject {

    NSString * name;
}

@property (retain) NSString * name;

- initWithName:(NSString * )name_;
@end


@implementation DataMode

@synthesize name;

- initWithName:(NSString * )name_
{
    if ([super init] != nil)
    {
        name = name_;
        return self;
    }
    return nil;
}

@end


- (void) pressed:(id)sender
{

        NSString * str = [NSString stringWithFormat:@"zhang"];
        DataMode * a = [[DataMode alloc] initWithName:str];

        a.name;
        a.name;
        a.name;
        a.name;
        a.name;

        NSLog(@"name count:%d",[a.name retainCount]);

        [ a  release];

        NSLog(@"str count:%d",[str retainCount]);

}
@end

the output is
name count:7
str  count:7

но код не пропускает память. Я получаю результат по утечкам и активным средствам мониторинга.

начинаю, я удивлен

потому что

Кто-то говорит: "@ имя свойства (сохранить)"; eaual ниже равный метод.

- getname
{
    return name;
}

если это .Это не может объяснить вышеуказанный результат вывода

Я думаю, что метод должен так

- getname
{
    [name retain];
    [name autorelease];
    return name;
}

так что это может объяснить большое число 7, а не утечь память.

это мое предположение. это занимает слишком много времени. Мне стыдно.

Мое понимание верно ??? приветствую ваш пост и комментарий.

Ответы [ 4 ]

4 голосов
/ 24 сентября 2011

«SomeBody» не так. От Язык программирования Objective-C :

Если указать retain или copy и не указывать nonatomic, то в среда с подсчетом ссылок, синтезированный метод доступа get для свойство объекта использует блокировку и сохраняет и автоматически выпускает возвращенный значение - реализация будет похожа на следующее:

[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Если указать nonatomic, синтезированный метод доступа к свойству объекта просто возвращает значение напрямую.

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

1) retainCount бесполезен для вас.

2) retainCount бесполезен для вас.

3) да, ваши свойства должны использовать retain + autorelease (есть несколько случаев, когда вы можете нарушить это правило - я не буду их здесь подробно описывать)

- (NSString *)name { return [[name retain] autorelease];

(обратите внимание, что это также не потокобезопасность и не свойства)

4) ваши свойства NSString должны быть объявлены copy (не retain)

5) ваш initWithName: должен скопировать аргумент name_ (при условии, что свойство скопировано)

name = [name_ copy];
1 голос
/ 24 сентября 2011

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

retainCount бесполезен. Не называй это.

Повторить:

retainCount бесполезен. Не называй это.

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

Есть несколько проблем с вашим кодом (но утечка не является одной из них):

  • NSString * свойства должны быть copy

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

  • не существует метода dealloc

Поскольку вы использовали stringWithFormat:, постоянная строка превращается в непостоянную строку. Если бы вы использовали постоянную строку или stringWithString:, это было бы что-то недопустимое (без знака -1 ... UINT_MAX ...).

В любом случае у вас есть:

  • + 1 для stringWithString:
  • + 1 для вызова a.name, каждый раз, когда он вызывается

Если Instruments заявляет об утечке, опубликуйте скриншот.

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

Вы набираете тип

- initWithName:(NSString * )name_
{
    self = [super init];

    if (self != nil)
    {
        name = name_;
    }
    return self;
}
...