我完全对这个小的“超出范围”的事情感到困惑。所以这里有一些代码来描述我的情况:
简单的基于 iphone 视图的应用程序。
查看控制器标头:
#import <UIKit/UIKit.h>
@interface global_nsstring_testViewController : UIViewController {
UIImageView* image_view;
NSString* image_name;
}
@property (nonatomic,retain) UIImageView* image_view;
@property (nonatomic,retain) NSString* image_name;
- (void) fadeView:(UIImageView*)View andThenChangeImageTo:(NSString*)Name;
- (void) switchImageAfterFade;
@end
查看控制器.m:
#import "global_nsstring_testViewController.h"
@implementation global_nsstring_testViewController
@synthesize image_view, image_name;
- (void) viewDidLoad {
image_view = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1.png" ofType:nil]]];
// ## Block 1 ##
// NSString* name = @"image2.png";
// [self fadeView:image_view andThenChangeImageTo:name];
// ## Block 2 ##
// NSString* name = [NSString stringWithFormat:@"image%d.png",2];
// [self fadeView:image_view andThenChangeImageTo:name];
[self.view addSubview:image_view];
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// ## Block 3 ##
// NSString* name = @"image2.png";
// [self fadeView:image_view andThenChangeImageTo:name];
// ## Block 4 ##
NSString* name = [NSString stringWithFormat:@"image%d.png",2];
[self fadeView:image_view andThenChangeImageTo:name];
}
- (void) fadeView:(UIImageView*)View andThenChangeImageTo:(NSString*)Name {
image_name = Name;
image_view = View; // ## Point 1 ##
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(switchImageAfterFade)];
View.alpha = 0.3;
[UIView commitAnimations];
}
- (void) switchImageAfterFade {
UIImage* image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:image_name ofType:nil]]; // ## Point 2 ##
[image_view setImage:image];
}
- (void) dealloc {
[image_view removeFromSuperview];
[image_view release];
[super dealloc];
}
@end
使用未注释的#Block 4#,我在#Point 1# 的 image_name var 上从调试器收到“超出范围”消息。因此我在#Point 2# 得到 EXC_BAD_ACCESS。
但是,使用未注释的 #Block 3# 或 #Block 1# 而不是 #Block 4# 一切正常,所以我想这都是关于 NSString ...
我尝试使用 NSMutableString,但也没有任何成功。
因此,如果有人能告诉我,我做错了什么或如何解决它,我将不胜感激。
另一个奇怪的事情,我不明白:
如果取消注释#Block 2#并且不使用任何断点,它不会崩溃,但图像会消失。但是,如果我在#Point 2# 设置断点,它会在一步之后崩溃,并出现 EXC_BAD_ACCESS。
xCode 版本:3.2.3