iPhone - NSUndoManager + NSInvocation + объект освобожден = сбой - PullRequest
0 голосов
/ 31 мая 2011

Я создаю функцию отмены / повтора для моего приложения. Я использую метод NSInvocation NSUndoManager.

Вот как я строю вызов

NSNumber *firstState = [NSNumber numberWithInt:fsNumber];
NSInvocation *initialState = [self restoreStateInvocation:firstState];
// ... the code continues...

это методы, относящиеся

- (NSInvocation *) restoreStateInvocation:(NSNumber*)number {
  NSMethodSignature *executeMethodSignature = [self methodSignatureForSelector:
                                                 @selector(makeUNDO:)];
  NSInvocation *moveInvocation = [NSInvocation invocationWithMethodSignature: executeMethodSignature];
  [moveInvocation setTarget:self];
  [moveInvocation setSelector:@selector(makeUNDO:)];

  [moveInvocation setArgument:&number atIndex:2];
  return moveInvocation;
}


- (void) makeUNDO:(NSNumber*)number {

  int num = (int)[number intValue];
  // code crashes at this line... number appears to be deallocated at this time
  //
...
}

когда UNDO / REDO вызывает initialState, приложение вылетает в первой строке makeUNDO, как указано в коде.

как мне сохранить номер без утечки?

спасибо.

Ответы [ 2 ]

1 голос
/ 31 мая 2011

правильный ответ - добавить следующую строку для restoreStateInvocation ...

[moveInvocation retainArguments];
0 голосов
/ 31 мая 2011

вы можете сохранить NSNumber объект, потому что он унаследован от NSObject.

NSNumber* myNumber = [number retain];

вам также нужно release, как только вы закончили использовать myNumber .

[myNumber release].

РЕДАКТИРОВАНИЕ:

Используйте подход, описанный ниже ...

вы могли бы иметь myNumber в качестве вашего ученика.

в .ч

   @interface myClass {
     NSNumber* myNumber;
     }
     ............
     ............
     @property(nonautomic,retain)  NSNumber* myNumber;

     @end

В файле реализации (файл .m).

@implementation myClass 
@synthesize myNumber;

-(void) dealloc{

   if(myNumber)
   {
       [myNumber release];
       myNumber  = nil ;
   }
}

- (void) makeUNDO:(NSNumber*)number {

  self.myNumber  = nil;
  self.myNumber  = number;


  int num = (int)[self.myNumberintValue];
  NSLog(@"My Number -->%d", num )

  //
  ...
}
...