这是我的ItemInfo
类接口
@interface ItemInfo : NSObject {
NSString *item;
}
@property (nonatomic, copy) NSString *ipaddress;
......和实施
@synthesize item;
- (id) initWithItem:(NSString *)someItem {
self = [super init];
if(self) {
item = someItem; // Ideally these things should happen here.
// Since item is a NSString and not NSMutableString,
// it should be sent a retain, thus
// making its refcount = 1
// Is my understanding correct?
}
return self;
}
- (void) dealloc {
[item release]; // I own 'item', so I should release it when done
[super dealloc];
}
我正在从其他地方使用这个类:
char *str = inet_ntoa(addy->sin_addr);
ItemInfo *h = [[ItemInfo alloc] initWithItem:[NSString stringWithFormat:@"%s", str]];
ContentBrowserViewController *d
= [[ContentBrowserViewController alloc] initWithItemInfo:h];
[self.navigationController pushViewController:d animated:YES];
[h release];
[d release];
我遇到的崩溃是
*** -[CFString release]: message sent to deallocated instance 0x6225570
。 0x6225570
是h.item
我哪里错了?
答案 0 :(得分:4)
您需要使用self.item = someItem
致电您的二传手。您目前忽略了setter,因此不会复制/拥有String。
答案 1 :(得分:3)
在initWithItem:
中,您需要执行item = [someItem copy];
您 也可以item = [someItem retain];
,但如果您的字符串是NSMutableString,则会导致问题。< / p>
崩溃的原因是你传递了一个自动释放的字符串,而你的initWithItem:
没有说“我需要这个字符串留在”(保留)或 “我需要这个字符串的个人版本”(复制)。因此,当您在dealloc中释放字符串时,字符串会过于频繁地释放。
根据你的消息来源,我愿意打赌,你发布的代码中没有发生崩溃,但实际上当NSAutoreleasePool最终释放字符串时。