iOS 基础

2018-06-05  本文已影响10人  我想哟

1.weak

(1)在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性。

@property(nonatomic,weak)id<Delegate> delegate;

(2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。在下文也有论述:《IBOutlet连出来的视图属性为什么可以被设置成weak?》

@property (weak, nonatomic) IBOutlet UIView *view;

2.assign

assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

@property (assign, nonatomic) float lat;
@property (assign, nonatomic) float lon;

2.copy

1.用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

@property (nonatomic, copy) NSString *userId;

2.如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
3.在非集合类对象中:对 immutable 对象进行 copy 操作,是指针复制,mutableCopy 操作时内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。用代码简单表示如下:

1.[immutableObject copy] // 浅复制
2.[immutableObject mutableCopy] //深复制
3.[mutableObject copy] //深复制
4.[mutableObject mutableCopy] //深复制

3.nonatomic和atomicity

nonatomic 不使用同步锁

5. @使用 @property?

property 只会生成 setter 和 getter 方法声明

@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end

#mark+++====================+++

@interface Person : NSObject
- (NSString *)firstName;
- (void)setFirstName:(NSString *)firstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)lastName;

@end

6. @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

1.原子性--- nonatomic 特质
nonatomic禁止多线程,变量保护,提高性能。
atomic 系统会自动的创建lock锁,锁定变量(避免该变量的读写不同步)

2.读/写权限---readwrite(读写)、readonly (只读)

3.内存管理语义---assign、strong、 weak、unsafe_unretained、copy

4.方法名---getter=、setter=
getter=的样式:
@property (nonatomic, getter=isOn) BOOL on;
setter=一般用在特殊的情境下,比如:
在数据反序列化、转模型的过程中,服务器返回的字段如果以 init 开头,所以你需要定义一个 init 开头的属性,但默认生成的 setter 与 getter 方法也会以 init 开头,而编译器会把所有以 init 开头的方法当成初始化方法,而初始化方法只能返回 self 类型,因此编译器会报错。
这时你就可以使用下面的方式来避免编译器报错:
@property(nonatomic, strong, getter=p_initBy, setter=setP_initBy:)NSString *initBy;
另外也可以用关键字进行特殊说明,来避免编译器报错:
@property(nonatomic, readwrite, copy, null_resettable) NSString *initBy;

iOS

  1. 集合的深复制与浅复制(参见这里
上一篇 下一篇

猜你喜欢

热点阅读