斯坦福公开课IOS应用开发笔记(一)

来源:互联网 发布:excel让一列数据递增 编辑:程序博客网 时间:2024/05/07 08:22

@property(strong,  nonatomic) NSString *contents;

为什么是非原子而不是线程安全?

因为IOS中的多线程不是一个对象上多个线程在设置,我们通常有另一组对象,运行在另外一个线程。

使用@property时,OC会创建get方法和set方法,来自动为我们设置contents

如果不设置非原子,这里会有各种锁定代码(违背了我们希望代码越简单越好的初衷)

如果你有多线程,允许多线程访问这里的settergetter,那就需要锁定代码,而我们不想要锁定代码——尤其是我们要自己实现settergetter时。

但默认情况下,我们不需要自己实现settergetter,OC会自动为我们实现


Strong、Weak属性

OC中的数据都放在堆(内存)中,OC能够自动分配以及释放内存。

那么它是如何知道何时释放内存?

OC会追踪指向强指针指向的对象,只要强指针存在,OC就会把它所指向的对象留在堆中。

而当强指针不存在时,内存会被立刻释放。

——[自动引用计数]可预见性强

 

弱指针则告诉OC:我有一个指针指向堆中的对象,只要还有强指针指向它就将它留在内存中,只要不再有强指针指向它,内存就会释放。

此时这个弱指针会被设置成nil(表示这个指针不指向任何东西)

在OC中,可以发消息给nil指针而不造成程序crash

将消息发送给nil指针,它显然不会执行任何代码,因为这里没有实例,而且如果有返回值它会返回0

 

强指针指向一个对象。

1.把强指针设置成nil,那么就没有指针指向该对象,就能释放这里的内存(OC自动释放)

2.把该指针指向另一对象,那么原对象没有指针指向,内存得以释放

 

weak指针的情况下,不仅是释放内存,指针还会被设置为nil



@property(nonatomic) BOOL chosen;


BOOL类型(原始类型),这些属性不需要强或弱来修饰,

它们是原始类型,没有存储在堆中。这里只是整形或浮点型,没有内存需要管理。

这里不需要强弱指针,这里不涉及到指针




@synthesize contents = _contents;

//.m文件中

//这行代码不会显示出来,但确实存在,是oc自动生成的

//分配实例变量来存储contents属性

这里,_contents是实例变量的名字

属性contents将存储于此



0 0
原创粉丝点击