小生刚刚把 C 的指针学会,手里正好有一本 objective-C 的入门书,照着第二章的代码打了一下,发现 const 修饰的变量竟然可以修改且不报错,查找网上的资料后试着改了下代码,发现还是可以成功编译,请各位大大看一下这段代码,哪里出错了呢?//
// main.m
// 2.1.4_const_modifier
//
// Created by Cirno MainasuK on 2014-11-30.
// Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
const NSString *foo = @"MY_CONSTANT";
// 执行一些操作
foo = @"SOME_OTHER_VALUE"; // 这会产生一个编译器错误
if ([foo isEqualToString:@"MY_CONSTANT"]) {
NSLog(@"%@", foo);
// 执行操作
}
NSLog(@"%@", foo);
return 0;
}
修改后的另一个版本//
// main.m
// 2.1.4_const_modifier
//
// Created by Cirno MainasuK on 2014-11-30.
// Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
NSString const *foo = @"MY_CONSTANT";
// 执行一些操作
foo = @"SOME_OTHER_VALUE"; // 这会产生一个编译器错误
if ([foo isEqualToString:@"MY_CONSTANT"]) {
NSLog(@"%@", foo);
// 执行操作
}
NSLog(@"%@", foo);
return 0;
}
附截图一张 TAT
// main.m
// 2.1.4_const_modifier
//
// Created by Cirno MainasuK on 2014-11-30.
// Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
const NSString *foo = @"MY_CONSTANT";
// 执行一些操作
foo = @"SOME_OTHER_VALUE"; // 这会产生一个编译器错误
if ([foo isEqualToString:@"MY_CONSTANT"]) {
NSLog(@"%@", foo);
// 执行操作
}
NSLog(@"%@", foo);
return 0;
}
修改后的另一个版本//
// main.m
// 2.1.4_const_modifier
//
// Created by Cirno MainasuK on 2014-11-30.
// Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
NSString const *foo = @"MY_CONSTANT";
// 执行一些操作
foo = @"SOME_OTHER_VALUE"; // 这会产生一个编译器错误
if ([foo isEqualToString:@"MY_CONSTANT"]) {
NSLog(@"%@", foo);
// 执行操作
}
NSLog(@"%@", foo);
return 0;
}
附截图一张 TAT
解决方案 »
- 如何只设置某个controller视图为横屏
- 各位开发ios的你们都用的什么笔记本啊?
- IOS中,在使用UDP编程运行时遇到_OBJC_CLASS_$_AsyncUdpSocket, referenced from:问题
- xcode project navigator里面的路径错了怎么办?
- 增加viewcontrol视图显示一半, 系统加载背景图
- Lable中的字体怎么实现删除线?就是字体上中间加横线
- 请教个问题。。很弱智,不要嘲笑。。
- button的点击事件貌似被抢
- 请问苹果的内购充值为什么一般以6元、18元、30元还有50元这样的固定金额,不能提供自定义价格充值?
- iOS 金融理财app审核被拒5.2.1
- 手中有台iphone做开发//电脑上搭建什么环境呢?
- ios8.1的不支持ad-hoc,不支持itms-services下载
首先,
NSString const *foo = @"MY_CONSTANT";
const NSString *foo = @"MY_CONSTANT";
本来就是等价的声明。要想有错误或者换一个版本,应该是
NSString* const foo = @"myconstant";
指的是 *foo 是一个常量。
NSString* const foo = @"";
这样是指 foo 是一个常量。
这样改过的确是会报错,不过有趣的是:const NSString* foo = @"MY_CONSTANT";
并不会出错呢,看来优先级很重要。(这个居然是这本书的印刷错误诶,不过按照上面的情况来看,const的位置就不对呢
int *const a; //指向整型数的常指针,指针所指向的地址不能改变
const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
中s指针本身能不能改,或者s指向的数据能不能改NSString只能要求指针本身能不能改,
NSString的数据是不能改的吧?
NSMutableString的数据才可以
const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
面试时,这道题答错的人,我不会怪他;
答对的人,我才担心呢.
会特别交待,不能使用这么生偏的技巧,特别是接口中出现const int init(const char const* const level) const;看到类似的接口,还得我拿起书本复习一下才能接着往下做事.对于数据,谁创建,谁释放,别人只能使用,不能修改....一旦跨过了这个规则,就需要在文档里面写明.....