Зомби NSString при вызове из другого объекта - PullRequest
0 голосов
/ 21 ноября 2011

Я могу передавать базовые данные между классами, но когда я пытаюсь передать NSString* из моего UIApplicationDelegate, я получаю EXC_BAD_ACCESS / NSZombie.

Есть ли что-то особенное, что я должен сделать, чтобы вернуть NSObject? Это связано с многопоточностью? (Я думал, что настройка atomic для свойства позаботится об этом?)

AppDelegate.h:

@interface AppDelegate : NSObject <UIApplicationDelegate> {
  NSString * currentNoteName;
}
@property (atomic, assign) NSString *currentNoteName;
@end

AppDelegate.m:

- (void)timerCallback:(NSTimer *)timer {
    currentNoteName = [NSString stringWithCString:(tone->freq).c_str() encoding:NSUTF8StringEncoding];

// This works:
    NSLog(@"Current Note Name in timerCallback: %@", currentNoteName);

OtherObject.m:

// Returns a Zombie object & EXC_BAD_ACCESS:
NSString *currentNoteName = [appDelegate currentNoteName];

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Если вы не используете ARC, вы должны использовать свойство retain:

@property (atomic, retain) NSString *currentNoteName;

и присвоить ему значение, используя setter:

self.currentNoteName = [NSString stringWithCString: ...];

и не забудьте освободить экземплярэтого ивара в вашей dealloc реализации AppDelegate:

- (void) dealloc {
  [currentNoteName release], currentNoteName = nil;
  [super dealloc];
}
0 голосов
/ 21 ноября 2011

Проблема в «назначении», поскольку строка из «[NSString stringWithCString» автоматически освобождается.Может быть, вы можете изменить его на «копировать» или «сохранить».(я думаю, что копия лучше).

0 голосов
/ 21 ноября 2011

вы присваиваете значение и автоматически выпускаете экземпляр NSString.Вместо этого используйте retain.

...