0

我可以在类之间传递基本数据,但是当我尝试NSString*从我的传递 a 时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);

其他对象.m:

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

3 回答 3

2

如果不使用 ARC,则必须使用保留属性:

@property (atomic, retain) NSString *currentNoteName;

并使用 setter 为其分配一个值:

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

并且不要忘记在您的dealloc实现中释放此 ivar 的实例AppDelegate

- (void) dealloc {
  [currentNoteName release], currentNoteName = nil;
  [super dealloc];
}
于 2011-11-21T14:25:40.347 回答
0

您正在分配一个值并自动释放 NSString 实例。改用保留。

于 2011-11-21T14:25:12.640 回答
0

问题是“assign”,因为“[NSString stringWithCString”中的字符串是自动释放的。也许您可以将其更改为“复制”或“保留”。(我认为副本更好)。

于 2011-11-21T14:29:12.563 回答