【问题标题】:NSString out of scopeNSString 超出范围
【发布时间】:2011-09-30 02:56:27
【问题描述】:

我使用下面的代码来设置一个 NSString

#import <Foundation/Foundation.h>

@interface AppController : NSObject
{


    NSString *myString;


}

@property (nonatomic, retain) NSString *myString;
@end

#import "AppController.h"


@implementation AppController
@synthesize myString;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    NSString *zs0= [[NSString alloc] initWithFormat: @"abc"];
    myString =[zs0 retain];
    [zs0 release];//breakpoint

}

- (void)dealloc {


    [myString release];


    [super dealloc];
}




@end

当我在断点检查 myString 的值时 它总是说“超出范围”

欢迎评论

【问题讨论】:

  • 有时调试器会这样做。在控制台窗口中输入“po myString”,看看你会得到什么。
  • (保留/释放有点多余。你可以废弃这对。或者,我最喜欢的,做self.myString = [NSString stringWithFormat:@"abc"];。)
  • (这是我关于这个主题的最后一句话。)
  • 建议不要在init 方法中调用访问器。您应该直接设置 ivars 的值。
  • 同样的结果,如果我在代码 'myString =[zs0 retain];' 之前定义 myString而不是定义为对象 AppController 的成员,一切正常

标签: cocoa


【解决方案1】:
  1. 您不需要临时变量 zs0 - 只需将其分配给属性
  2. 您不需要 initWithFormat,因为您没有进行格式化。
  3. 您不需要分配字符串 - 如果您调用 [NSString stringWithString],它会自动释放它,然后当您将它分配给(保留)属性时,它会保留它。
  4. 你已经过度保留了。您分配给它保留计数为 1 的字符串,然后将其保留为 2,然后将其分配给一个保留属性,该属性再次保留它。

一种简单的方法是:

self.myString = [NSString stringWithString:@"abc"];

这将创建一个自动释放的字符串(不是使用 alloc 创建的,按约定复制),然后属性将保留它。

【讨论】:

  • 同样的结果,如果我在代码 'myString =[zs0 retain];' 之前定义 myString而不是定义为对象 AppController 的成员,一切正常
【解决方案2】:

如果您不使用格式,为什么还要使用 initWithFormat?接下来,如果您不打算使用它,为什么还要分配 zs0?只需将 myString 设置为您想要的。 因此,您的代码应如下所示:

myString = [[NSString alloc] initWithString: @"abc"];

试一试,一切都会好起来的。

【讨论】:

  • 同样的结果,如果我在代码 'myString =[zs0 retain];' 之前定义 myString而不是定义为对象 AppController 的成员,一切正常
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2012-05-04
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2014-02-25
相关资源
最近更新 更多