IBOutlet

为了使用Interface Builder,我们需要在如XXViewController.h中增加IBOutlet标记。
IBOutlet对于编译器而言只是一个标记,也就是说,编译器会忽略这个关键字。
Interface Builder则是根据IBOutlet来寻找可以在Builder里操作的成员变量。
需要注意的是,任何一个被声明为IBOutlet并且在Interface Builder里被连接到一个UI组件的成员变量,会被额外retain一次。
常见的情形如
IBOutlet UILabel *label;
这个label在Interface Builder里被连接到一个UILabel。此时,这个label的retainCount为2。
所以,只要使用了IBOutlet变量,一定需要在dealloc或者viewDidUnload里release这个变量。

摘自http://googlers.iteye.com/blog/1633442



以下摘自http://blog.tianya.cn/blogger/post_read.asp?BlogID=1912959&PostID=28405275

Interface Builder参与的内存管理问题

  如果一个变量在类中被定义为了 IBOutlet 那么你无需对其进行实例化,xib载入器会对其初始化。
 如果一个变量在类中被定义为了 IBOutlet 那么你必须负责将其释放。xib载入器不会帮忙的… …
 切不要初始化两回,内存会溢出,而且对象锁定也会出错。

内存管理部分示例

[NSArray array][NSDate date]方法建立一个索引计数为1的对象,但是也是一个自动释放对象。所以是本地临时对象,那么无所谓了。如果是打算在全Class中使用的变量(iVar),则必须retain它。

传递对象时,如果是本对象是在局部使用时,可以不用考虑retain的问题,如果要全局使用,使用时要retain下再赋值


问题一:

   value = [array objectAtIndex:n]; //得到一个数组中的对象

 [arry removeObjectAtIndex:n]; //卸载那个对象

 因为value得到了那个对象,但是由于另外一个拥有者release了该对象,所以其实value现在成了摇摆指针(无效数据)

问题二:

 myArray = [NSArray array];

 ...

 [myArray release];

 NSArray返回的是一个自动释放对象,不仅myArray不应该在一段时间后release,而应该在适当的时候先retain,以防止该array被系统误释放。

问题三:

 rocket = [rocketLauncher aRocket];

 [rocketLauncher release];

 和array这种数据收集类对象一样,如果我们得到了一个类的子对象而不retain它,那么在原父类被释放的时候,这个rocket其实也会失去其意义。



另外一个比较容易忽略而又 比较经典的问题是实例变量的循环引用,Objective-C为此区分了,其实也相当相当的简单:

   1,强引用,上面讲的就是强引用,存在retainCount加一。

 2,弱引用,但凡是assign声明并直接用指针赋值实现的被称之为弱引用,不存在retainCount加一的情况。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值