我可以在课程之间传递基本数据,但当我尝试从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];
答案 0 :(得分:2)
如果不使用ARC,则必须使用retain属性:
@property (atomic, retain) NSString *currentNoteName;
并使用setter:
为其指定值self.currentNoteName = [NSString stringWithCString: ...];
并且忘记在dealloc
AppDelegate
的{{1}}实施中忘记发布此ivar的实例:
- (void) dealloc {
[currentNoteName release], currentNoteName = nil;
[super dealloc];
}
答案 1 :(得分:0)
您正在分配值并自动释放NSString实例。请改用保留。
答案 2 :(得分:0)
问题是“assign”,因为“[NSString stringWithCString”中的字符串是自动释放的。 也许你可以把它改成“复制”或“保留”。 (我认为复制更好)。