Я новичок в 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