Cocoa NSString超出范围

Cocoa NSString超出范围,cocoa,Cocoa,我使用下面的代码设置NSString #import <Foundation/Foundation.h> @interface AppController : NSObject { NSString *myString; } @property (nonatomic, retain) NSString *myString; @end #import "AppController.h" @implementation AppController @synthe

我使用下面的代码设置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
#导入
@接口AppController:NSObject
{
NSString*myString;
}
@属性(非原子,保留)NSString*myString;
@结束
#导入“AppController.h”
@应用控制器的实现
@合成myString;
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知{
NSString*zs0=[[NSString alloc]initWithFormat:@“abc”];
myString=[zs0 retain];
[zs0发布];//断点
}
-(无效)解除锁定{
[myString发布];
[super dealoc];
}
@结束
当我在断点处检查myString的值时 它总是说“超出范围”


欢迎评论

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

myString = [[NSString alloc] initWithString: @"abc"];
试试看,一切都会好起来的

  • 您不需要临时变量zs0,只需将其分配给属性即可
  • 您不需要initWithFormat,因为您不需要格式化
  • 您不需要分配字符串-如果调用[NSString stringWithString],它将自动释放该字符串,然后当您将其分配给(retain)属性时,它将保留该字符串
  • 你留得太多了。您将该字符串分配给保留计数为1的字符串,然后将其保留为2的字符串,然后将其分配给保留属性,该属性将再次保留该字符串
  • 一个简单的方法是:

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

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

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