Iphone 好几行代码,让我大吃一惊(或者NSString“超出范围”的两难……又一次)

Iphone 好几行代码,让我大吃一惊(或者NSString“超出范围”的两难……又一次),iphone,nsstring,scope,out,Iphone,Nsstring,Scope,Out,我完全被这个“超出范围”的小东西弄糊涂了。 下面是一些代码来描述我的情况: 简单的基于iphone视图的应用程序 查看控制器标题: #import <UIKit/UIKit.h> @interface global_nsstring_testViewController : UIViewController { UIImageView* image_view; NSString* image_name; } @property (nonatomic,retain) UIIm

我完全被这个“超出范围”的小东西弄糊涂了。 下面是一些代码来描述我的情况:

简单的基于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
使用未注释的#Block 4#我从位于#点1#的image#u name var上的调试器获得“超出范围”消息。因此,我在第2点获得了EXC#u BAD#u访问权限

但是,使用未注释的#Block 3#或#Block 1#而不是#Block 4#时,一切正常,所以我想这都是关于NSString的

我尝试过使用NSMutableString,但也没有成功

因此,如果有人能告诉我,我做错了什么,或者如何修复它,我将不胜感激

另一件奇怪的事,我不明白:

如果取消对#Block 2#的注释并且不使用任何断点,它不会崩溃,但图像将消失。但如果我在#点2#设置一个断点,只需一步,它就会因EXC#u BAD#u访问而崩溃


xCode版本:3.2.3

块4使用了一个方便的初始值设定项,因此您应该使用
[[NSString stringWithFormat:@“image%d.png”,2]retain]
,否则它将被自动删除。 不要忘记在为它分配了
self.image\u name=name

之后释放它。首先,调试器中的“超出范围”意味着调试器无法确定如何显示变量。这基本上是没有意义的。您可以通过单击控制台(控制台中有“gdb>”并键入来打印该值

po image_name
其次,您没有正确使用setter。你的两个变量都有@property,但你没有使用它们。当你这样做的时候

variable = value;
它只是设置变量——不调用属性方法。但是,

self.variable = value;
将调用属性setter,因为您已经得到了“nonatomic,retain”,所以它将保留您的变量,所有这些都将被扩展

在这种情况下,你在做什么

image_name = Name;
你想去哪里

self.image_name = Name;
或者(正如托布建议的那样)

当您开始进行Objective-C编码时,您会混淆在类中设置变量的两种方法,这是一件非常常见的事情,获得差异非常重要。如果不使用实例点变量,则不会调用属性

巧合的是,很多人也倾向于通过做类似的事情来混淆这一点

self.image_name = [Name retain];

这是绝对错误的。每次设置image\u Name时都会泄漏“Name”,因为setter中有双重保留(一次用于@property(非原子,retain),另一次用于
[Name retain]
)。

非常感谢您的解释!现在更清楚了。:)
image_name = [Name retain];
self.image_name = [Name retain];