iPhone - NSUndoManager + NSInvocation +对象发布=崩溃

时间:2011-05-31 03:25:39

标签: iphone nsundomanager

我正在为我的应用构建撤消/重做功能。我正在使用NSUndoManager的NSInvocation方法。

这是我构建调用的方式

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 个答案:

答案 0 :(得分:1)

正确答案是将以下行添加到restoreStateInvocation ...

[moveInvocation retainArguments];

答案 1 :(得分:0)

您可以保留NSNumber个对象,因为它继承自NSObject

NSNumber* myNumber = [number retain];

完成 myNumber 后,您还需要release

[myNumber release]

<强>编辑:

使用下面描述的方法......

您可以将 myNumber 作为您的班级成员。

在.h

   @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 )

  //
  ...
}