Cocoa NSString超出范围
我使用下面的代码设置NSStringCocoa 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
#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"];
试试看,一切都会好起来的
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的成员,一切正常