0

我在 for 循环中添加 NSOperation 子类的多个实例:

NSMutableArray * operations = [[NSMutableArray alloc]initWithCapacity:0];
     for(int i =1; i<81;i++){
         [operations addObject:[[PDFGenerator alloc]initWithPageNumber:i andPDFParser:pdf]];
     }
    [_queue addOperations:operations waitUntilFinished: NO];

在 PDFGenerator 中,我有一个变量,用于存储操作的当前页码。

@implementation PDFGenerator
int pageCounter;

在 PDFGenerator 的主要方法中,我正在记录当前页码,它为所有操作打印 80!

我已经通过使用@property 作为当前页数进行了修复,但我试图了解它为什么会发生。有任何想法吗?谢谢!

4

1 回答 1

1

当你只使用:

int pageCounter;

您正在创建一个全局变量。假设您在每次迭代中设置它,然后在您的 PDFGenerator 方法中引用它,它将始终使用它设置为的最后一个值。

例子:

// Bar.h
@interface Bar : NSObject
FOUNDATION_EXPORT int someThing;
@end

// Bar.m
@implementation Bar
int someThing;
@end

// Foo.m
#import "Foo.h"
#import "Bar.h"

@implementation Foo
- (void)doSomething 
{
    ++someThing;
}
@end

这是完全有效的代码,并且调用[Foo doSomething]increment someThing

如果你想要一个实例变量,它看起来像这样:

@interface Bar()
{
    int someThing;
}

@end

@implementation Bar
- (void)doSomething
{
    ++someThing;
}
@end

在这种情况下someThing被定义为实例变量(不是全局变量)。它是Bar.

于 2013-07-09T16:39:13.503 回答