Ios 常数值的修正
我理解两者的区别Ios 常数值的修正,ios,objective-c,pointers,constants,Ios,Objective C,Pointers,Constants,我理解两者的区别 NSString * const myString = @"Bar" 这是指向NSString的不可变指针 然后我们有: NSMutableString const * myMutableString = [[NSMutableString alloc]initWithString:@"Bar"] 这是指向常量NSMutableString的指针。myMutableString的值不能更改 那么为什么我们可以这样做呢 [myMutableString追加:@“Foo”] 没
NSString * const myString = @"Bar"
这是指向NSString的不可变指针
然后我们有:
NSMutableString const * myMutableString = [[NSMutableString alloc]initWithString:@"Bar"]
这是指向常量NSMutableString的指针。myMutableString的值不能更改
那么为什么我们可以这样做呢
[myMutableString追加:@“Foo”]
没有编译器错误,并且可以正常工作。它允许我更改值
在哪种情况下可以使用常量对象
谢谢
NSMutableString const * myMutableString = [[NSMutableString alloc]initWithString:@"Bar"]
为此,您可以更改“myMutableString”的值,因为它指向静态位置,该位置的值可能不同,但指向位置不能
因此,如果您遇到应用程序基url之类的情况,您必须定义应用程序中的每个服务调用都相同的url,如下所示:
1) 最简单的方法:
// Prefs.h
#define APP_BASE_URL @"app_base_url"
2) 更好的方法:
// Prefs.h
extern NSString * const APP_BASE_URL;
// Prefs.m
NSString * const APP_BASE_URL = @"app_base_url";
第二种方法的好处是更改常量的值不会导致整个程序的重建。您正在混淆对象的易变性和引用的易变性。引用是一个常量,但它引用的对象是可变的。即使我可以使用常量更新引用,比如NSMutableString const*myMutableString=[[NSMutableString alloc]initWithString:@“Bar”];[myMutableString appendString:@“Hello World”];myMutableString=[[NSMutableString alloc]initWithString:@“hvjhj”];它已编译并运行!您应该声明可变字符串,比如
NSMutableString*constmymutablestring=[[NSMutableString alloc]initWithString:@“Foo”]代码>!!那你就不能给它赋值了!您的声明对于可变的声明是错误的。对于不可变字符串,它是正确的!