3

我的理解是,诸如 [nsnumber initWithInt] 之类的“便利”方法应该创建指定类的副本,并初始化为所需的值。

minutesLeft=[NSNumber initWithInt:((timeLeft)%60)];

Timeleft 是一个整数,因此 initWithInt 应该可以工作,结果应该是 minutesLeft(设置为保留的属性)应该接收并保留新的 NSNumber。问题是由于某种原因,我收到“NSNumber 可能无法响应 +initWithInt”的警告。因为有问题的属性设置为保留,我不想使用 [nsnumber alloc] initwithint,因为那样我必须释放它。

有任何想法吗?

4

2 回答 2

4

您的意思是:[NSNumber numberWithInt:number]; 请记住,此值是自动释放的,因此您可能需要保留它。如果您使用的是 Mac,请不要担心。

当你想要这样的东西但它在其他类上不存在时,你总是可以编写一个类别来扩展任何可可类。

http://cocoadevcentral.com/d/learn_objectivec/

于 2010-09-05T04:11:12.707 回答
2

由于便利创建者并不总是可用,即:

self.minutesLeft = [NSNumber numberWithInt:number];

另一种模式很常见,如果您在没有可用的便利创建者时想要一个自动释放的对象:

self.minutesLeft = [[[NSNumber alloc] initWithInt:number] autorelease];

或者最后

NSNumber * n = [[NSNumber alloc] initWithInt:number];
self.minutesLeft = n;
[n release], n = 0;

此外,我认为假设应该编写新代码以与托管内存兼容(而不是垃圾收集)是一个好主意。如果您曾经在托管内存上下文中使用该程序,那么跟踪已发送额外自动释放的对象可能会非常耗时。可能会有许多难以跟踪或重现的错误(包括重大泄漏)。编写引用计数接口/例程应该是第二天性 - 在编写类时很容易编写,而不是稍后再添加(阅读:您必须阅读大量非常耗时的代码) - 然后你必须测试,测试,测试所有更新的程序。

于 2010-09-05T06:17:17.333 回答