Objective-C Сохранение счета идет от 0 до 2 - PullRequest
1 голос
/ 07 апреля 2011

Я новичок в Objective-C.Это мой первый пост здесь.Я создал синглтон для управления интерфейсом моих приложений к базе данных.Для начала я использовал NSMutableArray в качестве ivar.Как вы увидите в приведенном ниже коде и в выводе журнала, счет сохранения равен 0, прежде чем он назначен объекту NSMutableArray, а затем счет сохранения равен 2 после назначения.

Мне не ясно, почему этослучается.Это потому, что [NSMutableArray arrayWithObject: (id)] создает объект с сохраняемым счетчиком, равным единице, а затем присваивание self.dataList увеличивает сохраняемое количество?Безопасно ли называть релиз один раз?Это не похоже на то, что нужно делать.

Вот источник

#import <Foundation/Foundation.h>


@interface DataInterfaceObject : NSObject {
    NSMutableArray *dataList;

}

@property (nonatomic, retain) NSMutableArray *dataList;

+ (id) sharedAlloc;

@end

...

#import "DataInterface.h"

static DataInterfaceObject *sharedDataInterfaceObject = nil;

@implementation DataInterfaceObject

@synthesize dataList;

+ (id) sharedAlloc {    
    @synchronized(self) {
        if (sharedDataInterfaceObject == nil) 
            sharedDataInterfaceObject = [super alloc];
    }
    return sharedDataInterfaceObject;
}

+ (id) alloc {
    return [[self sharedAlloc] init];
}

- (id)init 
{
    @synchronized(self) {
        NSLog(@"In DataInterface init 1, RetainCount for dataList is %d", [self.dataList retainCount]);
        if (dataList == nil) {
            self = [super init];
            if (self) {
                //Instantiate list
                NSLog(@"In DataInterface init 2, RetainCount for dataList is %d", [self.dataList retainCount]);
                self.dataList = [NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa", @"Tour Eiffel", @"Ball", @"Lettuce", nil];
                NSLog(@"In DataInterface init 3, RetainCount for dataList is %d", [self.dataList retainCount]);
            }
        }
    }
    return self;
}

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

@end

Журнал показывает следующее:

2011-04-06 21:18:26.931 jobs[11672:207] initislized
2011-04-06 21:18:26.933 jobs[11672:207] In DataInterface init 1, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 2, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 3, RetainCount for dataList is 2

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

код:

[NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa",
    @"Tour Eiffel", @"Ball", @"Lettuce", nil];

Создает автоматически выпущенную переменную со счетом сохранения 1, которая будет выпущена в будущем. Ваше свойство также вызывает retain, поэтому при вызове оператора print объект будет иметь счетчик сохранения 2, а затем скоро будет уменьшен до 1.

4 голосов
/ 07 апреля 2011

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

Компетенции Cocoa Core

Какао с любовью имеетхорошая статья о создании синглетонов в Какао .

2 голосов
/ 07 апреля 2011

Да, причина, по которой все сводится к двум, заключается в том, что а) вы создаете объект и б) сохраняете объект, назначая его в self.dataList. Вы не несете ответственности за создание объекта, так как вы не вызывали + alloc, так что ваш -dealloc может выпустить dataList только один раз.

Тем не менее, @ Терри Уилкокс прав: не смотрите на -retainCount.

...