Сеттер Objective-C никогда не вызывается - PullRequest
0 голосов
/ 29 июля 2011

Я пытаюсь сделать NSMutableArray пригодным для использования в нескольких классах.У меня возникла проблема с определением и использованием пользовательского установщика, по какой-то причине, даже если я вызываю мой установщик, он никогда не выполняется (у меня настроен 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");}

}

Проблема возникает в моем View.m, когда я звоню '[navigationDelegate setCompleteLines: completeLines]; '.Насколько я могу сказать, это никогда не выполняется.Я также не уверен, что мой метод установки корректен в том смысле, что я пытаюсь передать массив из моего представления делегату приложения для использования в других классах.Если есть лучший способ сделать это, я был бы признателен за помощь.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Если вы не входите в эту функцию, на самом деле есть только одна надежная возможность: navigationDelegate - ноль.Проверьте это, войдя в систему или подтвердив это непосредственно перед отправкой ему сообщения в endTouches, а затем выясните, почему.

Cnage:

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

Кому:

    [linesInProcess removeObjectForKey:key];
    NSAssert(navigationDelegate != nil, @"navigationDelegate is nil");
    [navigationDelegate setCompleteLines:completeLines];
0 голосов
/ 30 июля 2011

Для дальнейшего использования / справки (и для ответа на ваш вопрос в комментариях) -

Основные сведения о точках останова:

  • Установка точек останова на или передСтрока, где вы подозреваете, что ваш код неожиданно ломается / не работает / ведет себя.Запустите вашу программу в режиме отладки ...
  • Если точка останова попадет: Изучите как стек вызовов, так и значения переменных в различных панелях отладки в Xcode, чтобы найти подсказки.
  • Или, если точка останова никогда не срабатывает: вернитесь на шаг назад в вызовах функций и установите там точку останова.

Если ничего другого, точки останова могут сузить вашу проблему с помощью процесса устранения и помочь вам лучше задавать вопросы, на которые вы получите быстрый ответ.=)


Хотя StackOverflow помог вам довольно быстро отследить эту проблему, вы можете сэкономить много времени и разочарования в будущем, если будете использовать точки останова.

В этомВ этом случае установка точки останова на или перед строкой: [navigationDelegate setCompleteLines:completeLines]; показало бы, что navigationDelegate равнялся нулю.Затем вы повторяете: установите точку останова на или перед тем, как назначить navigationDelegate, и повторите ее.Когда эта точка останова не не будет достигнута, вы поймете, что ваша проблема не в сеттере!=)

Возможно, вам все еще нужно было спросить "почему не вызывается viewDidLoad?"но с той частью путаницы, которую вы уже решили, ваш ответ пришел бы намного быстрее!Надеюсь, что это поможет вам в будущем ~

...