不能在栈上分配对象

//Interface type cannot be statically allocated
NSString stackString;

因为对象所占内存总是分配在“堆空间”中,而不会分配在栈上。
分配在堆中的内存必须直接管理(引用计数),分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。

字面量数组

使用语法糖创建数组,若数组元素有 nil,会抛出异常。因为语法糖相当于先创建一个数组,然后把方括号里的所有对象都加到这数组中。

id o1 = @"o1";
id o2 = nil;
id o3 = @"03"; NSArray *arrayA = [NSArray arrayWithObjects:o1,o2,o3, nil];
NSArray *arrayB = @[o1,o2,o3];

arrayA 只有一个元素,arrayB 会crash。

声明一个只在某一个某个文件中使用的常量

///只在本文件使用的常量
// 1. const 修饰符从右至左,因此下面是“一个常量,这个常量是指针,指向NSString对象”
// 2. 编译器不会创建符号,而是把所有遇到的变量都替换为常值。
static NSString *const klocalConstantStr = @"klocalConstantStr";

要注意 const 修饰符的位置。 static 的意思是该变量仅在定义此变量的编译单元中可见。

声明一个对外公开的常量

在头文件中,如下声明:

///需要向外公开某个常量
/// 在全局符号表里
extern NSString *const TGSringConst;

在实现文件(.m)中,实现这个常量。

//这个常量必须要定义,只能定义一次
//在数据段为字符串分配存储空间
NSString *const TGSringConst = @"TGSringConst";

这样子声明的变量会在全局符号表里。
这个方法比#define好,因为有类型信息,且不会重复定义。

参考

  • Matt Galloway, 爱飞翔. Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法[J]. 中国科技信息, 2014(6):131-131.
  • OCBasic

OC basic的更多相关文章

  1. OC第七节——内存管理

    戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还 ...

  2. iOS9基础知识(OC)笔记

    1月16日 Objective  C(20世纪80年代初) 一.OC语言概述 1.1985年,Steve  Jobs成立了NeXT公司 2.1996年,12月20日,苹果公司宣布收购了NeXT  ...

  3. OC的内存管理(一)

    在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...

  4. Moving Swiftly(从OC切换到Swift)

    Moving Swiftlyhtml, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0 ...

  5. OC内存管理-黄金法则

    1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...

  6. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  7. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  8. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  9. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

随机推荐

  1. 如何将网站部署到tomcat根目录下

    更改前访问:http://192.168.1.2/baby 更改后访问:http://192.168.1.2/ 打开tomcat/conf/server.xml找到 <Host name=&qu ...

  2. HDFS系列 -- HDFS预研

    1 HDFS概述 由于传统集中式的物理服务器在存储容量和数据传输速度等方面都有限制,故而越来越不符合这些数据的实际存储需要. 在大数据时代,大数据处理需要解决的首要问题是:如何高效地存储所产生的规模庞 ...

  3. Myeclipse如何更新maven

    选中项目-->右键-->Maven4MyEclipse-->Update Project-->勾选Force update of.....就ok了

  4. 将IP地址转化为整数

    $ip = 'IP地址';echo $intip = sprintf('%u',ip2long($ip)); //转换为无符号整型echo long2ip($intip);//将整型转换为ip

  5. 设定Word段落的背景色

    段落背景不同于文字区别.很多新接触word的朋友都找不到怎么弄. 先把光标停留在需要设置的段落文字上,或者选择需要设置的段落文字. 点击段落里的边框和底纹,如图 在弹出框中选择底纹. 选择需要填充的颜 ...

  6. 使用idea,springboot,springsession,redis实现分布式微服务的session 共享

    本次开发环境:idea2016.3.4 +jdk1.8+maven3.3.9+redis+springboot+jedis 本文中的项目使用Maven来管理项目依赖,使用Spring Session和 ...

  7. web问题

    模拟form提交过程中form(hidden)时:The frame requesting access has a protocol of "http", the frame b ...

  8. python中的 += 与 +

    这一部分首先要理解python内存机制,Python中万物皆对象. 对于不可变对象,改变了原来的值,其别名(变量名)绑定到了新值上面,id肯定会改变 对于可变对象,+ 操作改变了值,id肯定会变,而+ ...

  9. 避免图片路径访问405,可以用图片控件来显示局部相对路径,不需要域名就不会出现jpg静态资源访问错误

    <asp:Image ID="Image1" runat="server"/> protected void Page_Load(object se ...

  10. C# 下载文件 删除文件 写入文本

    由于经常用到文件处理,便自己封装了下 分享给大家. 包含写入文本  批量删除文件  下载文件 .--可直接使用 /// <summary> /// 写入到txt /// </summ ...