iOS基础知识1

来源:互联网 发布:费米估算法怎么用? 编辑:程序博客网 时间:2024/06/04 22:09

一、@property中有哪些属性关键字?

1、strong:释放旧对象将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,此关键字经常使用。

2、weak:不增加引用计数,不持有对象,因此也不能决定对象释放,对比assign的一个好处是,当对象消失时指针自动归为nil。

3、assign:适用于基础数据类型(NSInteger、CGFloat、...)不增加引用计数。

4、copy:建立一个索引计数为1 的对象然后释放旧对象,此属性只对那些实行了NSCopying协议的对象类型有效(NSString、Block)。

5、atomic和 nonatomic用来决定编译器生成的getter和setter是否为原子操作,atomic设置成员变量的@property属性时默认为是atomic 提供线程安全。

6、nonatomic:非原子性访问对于属性赋值的时候不加锁,多线程并发访问会提高性能,如果不加此属性则默认是两个访问方法都为原子型事务访问。

7、readonly:此标记说明属性是只读的。

8、readwrite:此标记说明属性会被当成读写的,这也是默认的。

9、unsafe_unretained:跟weak类似,声明一个弱引用,但是当引用计数为0时,变量不会自动设置为 nil(ios5加入的)。




二、weak属性需要在dealloc中置nil么?

不需要,在ARC环境无论是强指针还是弱指针都无需在dealloc设置为 nil , ARC会自动帮我们处理。




三、@synthesize和@dynamic分别有什么作用?

@synthesize:编译器期间,让编译器自动生成getter和setter方法。当有自定义的存或取方法时,自定义的存或取方法会屏蔽@synthesize生成的getter和setter方法。@synthesize variable = _variable;这个是给属性变量variable绑定一个实例变量_variable。

@dynamic:告诉编译器,不自动生成getter和setter方法,避免编译期间产生警告,然后由自己实现存取方法或者在运行时动态创建绑定。主要使用在CoreData实现NSManagedObject子类时使用,由CoreData框架在程序运行时动态生成子类属性。




四、ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

在编写代码时,@property什么都不写的话,会怎么样呢!大家有没有想过?

@property NSString *name;
我没有写任何属性关键字,其实这样也会有默认的属性关键字。

@property (strong, atomic, readwrite) NSString *name;




五、用@property声明的NSString、NSArray、NSDictionary经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。

如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。

copy所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用copy来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。



六、@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?

1、如果指定了成员变量的名称,会生成一个指定名称的成员变量。

2、如果这个成员变量已经存在了就不再生成了。

3、如果是@synthesize foo;会生成一个名称为foo的成员变量,也就是说:如果没有指定成员变量的名称会自动生成一个属性变量同名的成员变量。

4、如果 @synthesize foo = _foo;不会生成成员变量(实例变量)。

假如property名为foo,存在一个名为 _foo的实例变量,那么不会自动合成新变量了。