不能在栈上分配对象

//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. 设计模式-生成者模式之c#代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. asp.net core 视图组件化

    视图组件可以通过partial view或viewcomponent实现 partialview https://docs.microsoft.com/zh-cn/aspnet/core/mvc/vi ...

  3. struts2 的 ServletActionContext 和 actionContext,服务器代码测试, redirect 、dispatcher、chain、redirectAction

    一.ServletActionContext  和 actionContext HttpServletRequest request=ServletActionContext.getRequest() ...

  4. js把一个数组插入到另一个数组的指定位置

    var arr1 = ['a', 'b', 'c']; var arr2 = ['1', '2', '3']; // 把arr2 变成一个适合splice的数组(包含splice前2个参数的数组) a ...

  5. java如何从一段html代码中获取图片的src路径

    java如何从一段html代码中获取图片的src路径 package com.cellstrain.icell.Test; import java.util.ArrayList;import java ...

  6. (转)SQL Server 2008无法修改表的解决办法

    转自:http://www.soaspx.com/dotnet/sql/mssql/sql2008/sqlserver2008_20121010_9683.html 在SQL Server 2008 ...

  7. hbase使用MapReduce操作1(基本增删改查)

    操作代码 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apach ...

  8. 转载:<context-param>与<init-param>的区别与作用

    <context-param>的作用:web.xml的配置中<context-param>配置作用1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web ...

  9. Checkpoint--查看各DB上的脏页

    可以使用sys.dm_os_buffer_descriptors来看数据页在buffer pool中的状态,其中is_modified来标示数据页是否为脏页 --------------------- ...

  10. [转载]将json字符串转换成json对象

    例如: JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; J ...