我是Objective-C的新手,引用的计数让我困惑:-(。 在Xcode 5.0.2下的ARC模式下,当我用对象创建NSArray init时,不调用对象的dealloc方法,为什么?我应该手动从阵列中删除对象吗?但它是一个NSArray,怎么样?这是我的测试代码:
//------LCDRound.h file-------------
@interface LCDRound : NSObject
- (void)paint;
@end
//------LCDRound.m------------------
@implementation LCDRound
- (void)paint
{
NSLog(@"I am Round");
}
- (void)dealloc
{
NSLog(@"Round dealloc");
}
@end
//-------main.m---------------------
#import <Foundation/Foundation.h>
#import "LCDRound.h"
int main(int argc, const char * argv[])
{
LCDRound* round1 = [[LCDRound alloc] init];
LCDRound* round2 = [[LCDRound alloc] init];
NSArray* objects = [NSArray arrayWithObjects:round1, round2, nil];
for (LCDRound* shape in objects) {
[shape paint];
}
return 0;
}
答案 0 :(得分:4)
[NSArray arrayWithObjects:…]
返回一个自动释放的对象,
并且您的程序不提供自动释放池。 (这用于导致运行时
旧版iOS / OS X中的警告。)
如果您使用
NSArray* objects = [[NSArray alloc] initWithObjects:round1, round2, nil];
或添加自动释放池:
int main(int argc, const char * argv[])
{
@autoreleasepool {
LCDRound* round1 = [[LCDRound alloc] init];
LCDRound* round2 = [[LCDRound alloc] init];
NSArray* objects = [NSArray arrayWithObjects:round1, round2, nil];
for (LCDRound* shape in objects) {
[shape paint];
}
}
return 0;
}
然后您会再次看到dealloc
。