我在EXC_BAD_ACCESS
中收到main()
,这是我的代码:
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"TestBedAppDelegate");
[pool release];
return retVal;
}
@interface TestBedAppDelegate : NSObject <UIApplicationDelegate>
@end
@implementation TestBedAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[TestBedViewController alloc] init]];
[window addSubview:nav.view];
[window makeKeyAndVisible];
}
@end
- (void) action: (id) sender
{
[self highRetainCount];
}
@implementation TestBedViewController
- (void) highRetainCount
{
UIView *view = [[[UIView alloc] init] autorelease];
printf("Count: %d\n", [view retainCount]);
NSArray *array1 = [NSArray arrayWithObject:view];
printf("Count: %d\n", [view retainCount]);
[array1 autorelease]; // If comment this line, everything will be OK
}
@end
程序停在main()
:
int retVal = UIApplicationMain(argc, argv, nil, @"TestBedAppDelegate");
正如评论所说,在评论[array1 autorelease];
后,一切正常。
所以这是我的问题:
EXC_BAD_ACCESS
经常表示使用已发布的对象。显然,[array1 autorelease];
与main()
有关,但我无法理解他们之间的关系。
为什么停在这个位置 - {{1}} - 而不是其他地方?
新手问题:)
答案 0 :(得分:5)
arrayWithObject:
返回您不拥有的对象。因此,您随后发送autorelease
是错误的。
请参阅Basic Memory Management Rules,具体来说:
- 您不得放弃您不拥有的对象的所有权
和
- 您拥有自己创建的任何对象
使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象(例如,
alloc
,newObject
或{{1 }})。
另外,作为更一般的观点,请勿使用mutableCopy
。除非您碰巧正在对运行时或其他东西进行低级别的黑客攻击,否则您不需要它,并且它不会向您返回任何有用的东西。