一个菜鸟问题.
如果我有一个字符串@“你好我是一个字符串”.是@“”一个对象?它是什么 ?它存放在哪里?
如果我发布一个我没有创建的对象会发生什么?或者它的复杂性是什么?
NSString *string1 = [[NSString alloc] initWithString:@"string"]; NSString *string2 = string1; [string2 release];
还有一个问题是什么区别?
NSString *string1 = [[NSString alloc] initWithString:@"string"]; NSString *string2 = @"string";
我知道我是一个菜鸟但我只是想知道.
提前致谢
编辑:
我的意思是说init initWithString而不是stringWithString
解决方法
NSString * string2 = string1;
这不会创建新对象. string1不是对象,它是指向对象的指针.该赋值只是复制指针并将其放在string2中.
由于实现细节(内部实现细节在所有情况下都可能不是真的并且永远不应该依赖),这是真的:
NSString *string1 = [NSString stringWithString:@"string"]; string1 == @"string"; // this is a true expression
字符串常量 – @“dddd” – 由编译器编译成二进制文件.它们无法释放,每个唯一字符串只有一个常量. stringWithString:识别常量并且不创建新副本.
现在,如果你这样做:
NSMutableString *string1 = [NSMutableString stringWithString:@"string"]; NSMutableString *string2 = string1; [string2 release];
这会将@“string”复制到NSMutableString的新实例中,而string1将指向该对象.
但是,该代码将是一个过度释放([string1 release];也是),因为stringWithString:返回一个自动释放的对象.
现在,如果你是:
NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"string"]; NSMutableString *string2 = string1; [string2 release];
那么该代码在保留计数方面在技术上是正确的;字符串对象将被释放.但是在发布之后,string1和string2都是悬空指针 – 也就是说,它们所持有的地址不再指向可行的对象,并且尝试发送消息会产生未定义的结果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。