NSMutableArray как переменная экземпляра - PullRequest
1 голос
/ 19 августа 2011

У меня есть переменная экземпляра, которая является NSMutableArray

@interface SummaryWindowController : NSWindowController {

    NSMutableArray *aBuffer;

NSMutableArray устанавливается с помощью этого метода (вызывается из объекта, который инициализировал этот объект):

- (void)setGlobalStatusArray:(NSMutableArray *)myArray
{
    if (!aBuffer) {
        [myArray retain];
        NSLog(@"aBuffer not init , alloc init now");
        aBuffer = [[NSMutableArray alloc] initWithArray:myArray];
    }
    NSLog(@"--> Received buffer: %@",aBuffer);

}

NSLog показывает содержимое массива, когда этот метод запускается:

2011-08-18 16:00:26.052 AppName[74751:1307] --> Recievied buffer: (
        {
        discription = DiskUsage;
        menu = "<NSMenuItem: 0x1005116e0 Hardware Status>";
        status = Warning;
    },

Но в моем методе, который использует эту переменную экземпляра, он больше не кажется init'ed

- (IBAction)refreshButtonClicked:(id)sender
{
    NSLog(@"The user has clicked the update button");
    if (!aBuffer) {
        NSLog(@"refresh button not init");
    }
    NSLog(@"Buffer is currently:%@",aBuffer);
}

Как и когда ондо этого момента я вижу следующий NSLog:

2011-08-18 16:04:25.301 AppName[74829:1307] The user has clicked the update button
2011-08-18 16:04:25.303 AppName[74829:1307] refresh button not init
2011-08-18 16:04:25.304 AppName[74829:1307] Buffer is currently:(null)

Что бы указывало на то, что aBuffer был (auto?) освобожден?

Есть идеи, почему это будет делать это?Сначала я подумал, что у меня есть два разных объекта, один из которых я создал, запустив NSWindowController из исходного контроллера:

   @interface AppName_AppDelegate : NSObject 
    NSMutableArray *globalStatusArray;

    @implementation AppName_AppDelegate

    if ( summaryWindow ) {
            [summaryWindow release];
        } // end if
        summaryWindow   = [[SummaryWindowController alloc] initWithWindowNibName:@"SummaryWindow" owner:globalStatusController];
    [summaryWindow showWindow:self];
    [summaryWindow setGlobalStatusArray:globalStatusArray];

И тот, который был создан при загрузке пера, идентичные, но разные объекты, однако теперь я неНе думаю, что это так, поскольку я больше не вижу дубликатов NSLogs, поэтому я предполагаю, что это просто какая-то основная проблема с памятью с NSMutableArray (s)?

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Вы удерживаете myArray, когда вы должны удерживать aBuffer.

0 голосов
/ 19 августа 2011

Попробуйте использовать

@property (nonatomic, retain) NSMutableArray *aBuffer

в вашем интерфейсе.

Далее,

 @synthesize aBuffer

в вашем файле .m.После этого,

когда вы устанавливаете свой массив, сделайте это следующим образом:

    self.aBuffer = [[NSMutableArray alloc] initWithArray:myArray];

Обратите внимание на "self", чтобы вы указали свойство.

...