【问题标题】:iPhone - NSUndoManager + NSInvocation + object released = crashiPhone - NSUndoManager + NSInvocation + 对象释放 = 崩溃
【发布时间】:2011-05-31 03:25:38
【问题描述】:

我正在为我的应用构建撤消/重做功能。我正在使用 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 的第一行崩溃,如代码所示。

如何保留号码而不泄露?

谢谢。

【问题讨论】:

    标签: iphone nsundomanager


    【解决方案1】:

    正确的答案是在 restoreStateInvocation 中添加以下行...

    [moveInvocation retainArguments];
    

    【讨论】:

      【解决方案2】:

      您可以保留 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 )
      
        //
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2023-03-21
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多