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 を使用しない場合は、retain プロパティを使用する必要があります。

@property (atomic, retain) NSString *currentNoteName;

セッターを使用して、それに値を割り当てます。

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

deallocの実装で、この ivar のインスタンスを解放することを忘れないでくださいAppDelegate

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

" [NSString stringWithCString" からの文字列は自動解放されるため、問題は "割り当て" です。たぶん、「コピー」または「保持」に変更できます。(私はコピーが良いと思います)。

于 2011-11-21T14:29:12.563 に答える
0

値を割り当て、NSString インスタンスを自動解放しています。代わりに保持を使用してください。

于 2011-11-21T14:25:12.640 に答える