NSString内存管理问题:消息发送到解除分配的实例

Luc*_*uca 2 objective-c foundation

我有一个像这样声明的NSString:

.H:

@interface ViewController : UIViewController

{

        NSString * aString;

}
@property(nonatomic,copy)NSString *aString;
Run Code Online (Sandbox Code Playgroud)

.m:

@synthesize aString;

......

aString=[[NSString alloc]init];
aString=@"Hello World";

NSLog(@"%@",aString);//The app crashes here
Run Code Online (Sandbox Code Playgroud)

应用程序崩溃与此堆栈跟踪:

-[CFString respondsToSelector:]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)

gra*_*ver 8

删除行:

aString=[[NSString alloc]init];
Run Code Online (Sandbox Code Playgroud)

并为属性设置值:

self.aString=@"Hello World";
Run Code Online (Sandbox Code Playgroud)

执行:aString=@"Hello World";表示您正在为实例变量设置值,而不使用属性的访问器方法,那么您负责内存管理并且它更复杂.通过以下方式获取价值:self.aString也.
PS总是通过属性工作,几乎从不使用实例变量,(只在dealloc方法中释放ivar,否则如果你不擅长内存管理,你总会遇到问题,但属性会为你做一切)