我有一些声明为非原子并保留的日期和字符串。
当我使用self.string
设置日期或更改字符串时,它不会被保留。如果我强制它[string retain]
我没有问题,虽然这会造成内存泄漏。
任何想法或我做错了怎么样?
干杯
更新
@property (nonatomic, retain)NSDate *time;
self.time = [cal dateFromComponents:comps];
self.time
不保留。我必须[time retain];
答案 0 :(得分:1)
您要么释放字符串两次,要么在它已经被释放后访问它。如果你发布一些代码,它将有助于确定如果这还不够,将会发生什么。
答案 1 :(得分:0)
考虑序列:
0 NSObject *obj = [[NSObject alloc] init]; 1 [obj retain] 2 [obj release] 3 [obj release] 4 NSLog("@%@",obj); 5 [obj retain]
将在第4行崩溃(obj已被释放),而序列:
0 NSObject *obj = [[NSObject alloc] init]; 1 [obj retain] 2 [obj retain] 3 [obj release] 4 [obj release] 4 NSLog("@%@",obj);
将泄漏(obj保留计数为1)。
正如您可以看到相同的操作但是以不同的顺序可以将您的对象从额外释放更改为泄露。
答案 2 :(得分:0)
您是否合成了setter和getter方法?它们是通过在.m文件中包含以下代码行来合成的:
@synthesize time;
一般情况下,您可以在以下行之后执行此操作:
@implementation YourClass
这就是实际生成在设置变量时保留变量的方法,如下所示:
self.time = [cal dateFromComponents:comps];
答案 3 :(得分:0)
现在最好的学习方法是如何使用仪器找到这类问题的原因。
在Xcode 4中,转到产品/配置文件,您的项目将被编译,并且将出现“仪器”窗口。选择分配工具,然后通过单击看起来像REC按钮的红色按钮停止自动开始执行。
单击Allocations仪器前面的小i按钮。然后选择“记录参考计数”和“启用NSZombie检测”,现在再次通过单击相同的红色按钮运行。重现问题,当它崩溃时返回到“仪器”窗口,您将看到一个对话框,单击箭头并搜索问题的来源。 IMO你应该看看你的对象被错误释放的位置。