下午过来公司继续看项目代码,解决了困惑我已久的问题。
写OC代码也有几个月了,平时使用属性变量的时候也就那么用,并没有细细思考,该什么时候释放总是拿不准时机。比如有下面的例子
先声明一个属性变量如下:
@property(nonatomic, retain) NSString *str1;
再创建一个对象并初始化为 str1
NSString *tempStr = str1;
之后如果不用 tempStr 对象,无需释放 tempStr(假定所有需要的对象都已经初始化完毕)。但是如果是
str1 = tempStr;
则需要对 str1 进行释放,即使没有alloc也得释放。原因属性的set方法和get方法不一样。set方法如下:
- (void)setStr:(NSString *) str1
<span style="white-space:pre"> </span> {
//请注意以下不能使 用self.操作
<span style="white-space:pre"> </span> [str release];
<span style="white-space:pre"> </span> str = nil;
<span style="white-space:pre"> </span> str = [<span style="font-family: Arial, Helvetica, sans-serif;">str1</span> retain];
<span style="white-space:pre"> </span> }
也有下面的原型
<span style="white-space:pre"> </span> -(void) setStr:(NSString *)str1
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if (<span style="font-family: Arial, Helvetica, sans-serif;">str</span><span style="font-family: Arial, Helvetica, sans-serif;"> != str1 )</span>
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> [str1 retain];
<span style="white-space:pre"> </span> [str release];
str = str1;
}
<span style="white-space:pre"> </span> }
set方法会对之前的属性变量清空,并对的新的对象retain一次,为了平衡引用计数,所以后边需要释放一次;而get方法直接返回对象,不会进行retain操作,所以不需要再释放。
<span style="white-space:pre"> </span>-(NSString*) str
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> return str;
<span style="white-space:pre"> </span>}
这是今天收获的第一个点。
第二点就是在项目中查询所有的方法时("Find In Project"),输入方法名后,却怎么也查询不到相应文字,无法定位,后来尝试在方法名后面加上冒号,结果就能搜索到了。后边仔细一看,原来是不小心更改了查询条件,修改为:
Find -> Text -> Containing 即可查询到所有出现的目标文本,以前都没注意到这一点,此处mark下。
第三点,看到枚举类型的 NS_ENUM 和 NS_OPTIONS ,粗略的学习了下,这个枚举跟以前 C 语言的枚举 enum 有点不一样,是带参数的枚举类型。首先来看下NS_ENUM
typedef NS_ENUM(NSInteger, UITableViewCellStyle)<span style="font-family: Verdana;"> { </span>
}
第一个参数是一个类型,用来存储这个枚举类型定义的变量,需要确保指定的内存大小能够容纳变量的值,不然会出错,第二个变量即为新定义枚举类型的类型名,花括号里面的定义同之前的enum。这个方法能指定存储单元。
再来看看 NS_OPTIONS ,
<span style="white-space:pre"> </span>typedef NS_OPTIONS(NSUInteger, GDAnnotationType) {
<span style="white-space:pre"> </span>}
也是两个参数,这个枚举类型可以作“按位与”,“按位或”运算,就是如果同时需要两种属性的话,可以考虑用这个,通常里边的常量都是依次 左移 一位的,这样才能满足按位运算的要求。