我正在为我的应用构建撤消/重做功能。我正在使用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的第一行崩溃,如代码所示。
如何在不泄漏的情况下保留号码?
感谢。
答案 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 )
//
...
}