我有一個簡單的核心數據對象,只要我嘗試在Xcode中嘗試NSLog
的內容,就會給我一個EXC_BAD_ACCESS
。EXC_BAD_ACCESS當試圖在被管理對象中NSLOG NSSET時
管理對象是這樣的:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class ChatFriend, ChatMessage;
@interface ChatThread : NSManagedObject
@property (nonatomic, retain) NSString * threadId;
@property (nonatomic, retain) NSDate * timestamp;
@property (nonatomic, retain) NSSet *friends;
@property (nonatomic, retain) NSSet *messages;
@end
@interface ChatThread (CoreDataGeneratedAccessors)
- (void)addFriendsObject:(ChatFriend *)value;
- (void)removeFriendsObject:(ChatFriend *)value;
- (void)addFriends:(NSSet *)values;
- (void)removeFriends:(NSSet *)values;
- (void)addMessagesObject:(ChatMessage *)value;
- (void)removeMessagesObject:(ChatMessage *)value;
- (void)addMessages:(NSSet *)values;
- (void)removeMessages:(NSSet *)values;
@end
這是.m
文件:
#import "ChatThread.h"
#import "ChatFriend.h"
#import "ChatMessage.h"
@implementation ChatThread
@dynamic threadId;
@dynamic timestamp;
@dynamic friends;
@dynamic messages;
- (NSString*) description
{
/* This can print out the contents of self.messages correctly
for(ChatMessage *message in self.messages)
{
Log(@"ChatMessage - %@", message);
}
*/
// using %@ to print out self.messages directly, will fail:
return [NSString stringWithFormat:@"ChatThread - threadId:%@, messages count:%d, messages:%@", self.threadId, self.messages.count, self.messages];
}
@end
我發現,如果我試圖打印出self.messages的內容在stringWithFormat
線,EXC_BAD_ACCESS
會發生。如果我刪除self.messages,只打印self.messages.count
,它的工作原理。如果我手動執行一個for循環打印出消息NSSet
中的每條消息,它就會起作用,並證明那裏有一些值。
那麼,爲什麼直接打印self.messages會觸發EXC_BAD_ACCESS
?
奇怪。 self.messages是否會拋出此異常,即使經過循環並單獨打印每個成員之後? – 2013-03-10 10:34:34
當你打印[self.messages描述]時有什麼不同? – 2013-03-10 10:35:23
我不知道它解釋了這個問題,但如果這是一個OS X應用程序,那麼'count'將返回一個64位的'NSUInteger',並且應該使用'%ld'而不是'%d'來打印。 – 2013-03-10 10:45:13