0

这是简单的代码:

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
}];

[queue addOperation:op]

[someString release];

由于 someString 被释放,当 nsblockoperation 运行时,此代码将崩溃。防止这种情况的最佳做法是什么?

谢谢你。

编辑: ARC 不是一个选择,因为这不是我的决定。有什么办法可以在 MRC 中解决这个问题?

EDIT2:下面的代码呢?它会起作用吗?

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

[someString retain]
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
  [someString release]
}];

[queue addOperation:op]

[someString release];
4

2 回答 2

0
// let's say the variable is allocated with alloc/init
NSString *someString = [[[NSString alloc] initWithFormat:"%@", @"someString"] autorelease];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
}];

[queue addOperation:op];

周围有成千上万的应用程序需要维护并且不使用 ARC。将字符串包装在自动释放中。我认为这应该可行,但我没有测试。

于 2014-06-25T20:19:44.910 回答
-1

你真的应该使用Automatic Reference Counting,并将代码简化为

// let's say the variable is allocated with alloc/init
NSString *someString = @"someString";

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
}];

[queue addOperation:op]

如果你真的必须使用手动引用计数,你可以这样做:

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
  [someString release]
}];

[queue addOperation:op]

我知道它只是示例代码,但如果不是,你也可以这样做......;)

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction:@"someString"];
}];

[queue addOperation:op]
于 2014-06-25T19:53:09.610 回答