从不调用Objective-C setter

时间:2011-07-29 19:02:37

标签: objective-c nsmutablearray setter getter

我正在尝试使NSMutableArray在多个类中可用。我遇到了定义和使用自定义setter的问题,出于某种原因,即使我调用我的setter,它也永远不会执行(我在方法中设置了NSLog)。以下是所有相关代码:

AppDelegate.h

@interface TouchTrackerAppDelegate : NSObject <UIApplicationDelegate> {

NSMutableArray *completeLines;
}


@property (nonatomic, retain, setter = setCompleteLines:, getter = getCompleteLines) NSMutableArray *completeLines;


-(NSMutableArray*) getCompleteLines;
-(void) setCompleteLines:(NSMutableArray *) newLines;

AppDelegate.m

@implementation TouchTrackerAppDelegate

-(NSMutableArray*) getCompleteLines {
return self.completeLines;
}

-(void) setCompleteLines:(NSMutableArray *)newLines {
NSLog(@"gets here");
if (completeLines != newLines) {
    [completeLines release];
    completeLines = [newLines retain];
}

NSLog(@"completeLines global count: %i",[completeLines count]);
}

View.h

#import "TouchTrackerAppDelegate.h"

@interface TouchDrawView : UIView {
NSMutableDictionary     *linesInProcess;
NSMutableArray          *completeLines;
TouchTrackerAppDelegate *navigationDelegate;
}
@end

View.m *

#import "TouchTrackerAppDelegate.h"

- (id)initWithCoder:(NSCoder *)c 
{
[super initWithCoder:c];
linesInProcess = [[NSMutableDictionary alloc] init];
completeLines = [[NSMutableArray alloc] init];
return self;
}
- (void)viewDidLoad {
navigationDelegate = (TouchTrackerAppDelegate *)[[UIApplication sharedApplication] delegate];
}

-(void)endTouches:(NSSet *)touches
{
if([EditModeSingleton isEditMode]){
for(UITouch *t in touches){
    NSValue *key = [NSValue valueWithPointer:t];
    Line *line = [linesInProcess objectForKey:key];

    if(line){
        [completeLines addObject:line];
        [linesInProcess removeObjectForKey:key];
        [navigationDelegate setCompleteLines:completeLines];
        NSLog(@"completeLines count: %i", [completeLines count]);
    }
}
[self setNeedsDisplay];
}
   else {NSLog(@"in Play mode");}

}

当我调用'[navigationDelegate setCompleteLines:completeLines];'时,问题出现在我的View.m中。据我所知,这从未执行过。我也不确定我的setter方法是否正确,因为我试图将数组从我的视图传递给app delegate以便在其他类中使用。如果有更好的方法,我会感激一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您没有输入该功能,那么实际上只有一个可能性: navigationDelegate是零。通过在endTouches中向其发送消息之前记录或断言来验证这一点,然后找出原因。

Cnage:

    [linesInProcess removeObjectForKey:key];
    [navigationDelegate setCompleteLines:completeLines];

要:

    [linesInProcess removeObjectForKey:key];
    NSAssert(navigationDelegate != nil, @"navigationDelegate is nil");
    [navigationDelegate setCompleteLines:completeLines];

答案 1 :(得分:0)

供将来参考/帮助(并在评论中回答您的问题) -

简介断点基础:

  • 在您怀疑代码中断/失败/意外行为的行之前或之前设置断点。在调试中运行程序......
  • 如果断点被击中:检查Xcode中各种调试窗格中的调用堆栈和变量值以获取线索。
  • 或者,如果永远不会遇到断点:在函数调用中返回一步并在那里设置断点。

如果不出意外,断点可以通过消除过程缩小您的问题,并帮助您提出更快得到答复的更好问题。 =)


尽管StackOverflow可以帮助您快速找到这个问题,但如果您使用断点,将来可以节省大量时间和挫折。

在这种情况下,在行[navigationDelegate setCompleteLines:completeLines];之前或之前设置断点会显示navigationDelegate为零。然后重复:在navigationDelegate分配或之前设置断点并重新运行它。当这个断点没有被击中时,你会意识到你的问题不是你的二传手! =)

您可能仍然不得不问“为什么没有调用viewDidLoad?”但是由于你已经解决了部分困惑,你的答案会更快到达!希望在未来帮助你〜