iOS常用知识点总结一

1.理解内存中的区域

(1)栈区:由系统自动分配和释放,存放局部变量的值,容量小,速度快,有序

(2)堆区:自己分配和释放,不释放会出现内存泄漏,容量大,速度慢,无需

(3)静态储存区:全局变量和静态变量储存,程序结束,系统自动回收

(4)常量区:储存常量,程序结束,系统自动回收

(5)代码区:储存代码

2.copy关键字

(1)NSString,NSArray,NSDictionary 使用关键字

如果使用strong,可能会导致这个属性指向一个可变对象,如果这个对象在外部被修改了,则这个对象也会受到影响,虽然copy和strong类似,但是copy的设置方法并不会保留新值,而是将其拷贝,来确保NSString等不会受到影响

如果在NSMutableArray等中使用copy,可能会导致崩溃,因为copy会复制出一份不可变的NSArray的对象,在进行插入,删除的时候会发生崩溃


 NSArray *array = @[ @1, @2, @3, @4 ];

 NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];

 self.array = mutableArray;

 [mutableArray removeAllObjects];;

 NSLog(@"%@",self.array);

 [mutableArray addObjectsFromArray:array];

 self.array = [mutableArray copy];

 [mutableArray removeAllObjects];;

 NSLog(@"%@",self.array);

打印结果


2015-09-27  19:10:32.523 CYLArrayCopyDmo[10681:713670] (

)

2015-09-27  19:10:32.524 CYLArrayCopyDmo[10681:713670] (

  1,

  2,

  3,

  4

)

1. 对非集合类对象的****copy****操作

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

所以可以看出,对immutable对象进行copy,是指针复制,mutableCopy是内容复制,深复制,对mutable对象copy和mutableCopy都是深复制

2.集合类对象的copy操作

集合类对象是指 NSArray、NSDictionary、NSSet ... 之类的对象

[immutableObject copy] // 浅复制

[immutableObject mutableCopy] //单层深复制

[mutableObject copy] //单层深复制

[mutableObject mutableCopy] //单层深复制

2 block中的copy

block中的copy是MVC留下来的传统,是为了将创建在栈区的block拷贝到堆区,如果不拷贝的话,一旦在作用域之外来调用就会崩溃,另外,block在栈区里,但是很可能会用到一些变量,只要将其拷贝到堆区,才可以使用这些变量。

但是在ARC里写不写都行,strong和copy都可以的

3.类用copy关键字,重写copy关键字的setter方法

若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。


- (id)copyWithZone:(NSZone *)zone;

浅复制和深复制


- (id)copyWithZone:(NSZone *)zone {

 CYLUser *copy = [[[self  class] allocWithZone:zone]

  initWithName:_name

  age:_age

  sex:_sex];

 copy->_friends = [_friends mutableCopy];

  return copy;

}

- (id)deepCopy {

 CYLUser *copy = [[[self  class] alloc]

  initWithName:_name

  age:_age

  sex:_sex];

 copy->_friends = [[NSMutableSet  alloc] initWithSet:_friends

  copyItems:YES];

  return copy;

}

重写copy关键字的setter方法


- (void)setName:(NSString *)name {

 _name = [name copy];

}

3.@property中的属性关键字解析和原理(ivar,getter,setter)等

(1)原子性和非原子性 atomicity,nonatomic

atomicity,是默认的,原子的,使用了同步锁,大量使用会影响性能,几乎所有的属性都是nonatomic,因为atomic并不能保证线程安全,例如如果一个线程在不断读取一个属性值,但是另外一个线程在同时修改,就算有同步锁,也还是会读取到不同的属性值的。而且考虑到性能问题,不应该大量使用原子性。

(2)读/写 readwrite,readonly

使用读写属性的时候一般是这个样子的

.h文件


@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode;

.m文件


@property (readwrite, nonatomic, assign) AFSSLPinningMode SSLPinningMode;

(3)assign,unsafe_unretained,strong,weak,copy

assign:assign是一个property的默认属性,可以用于非oc对象比如CGFloat 或 NSlnteger 等


@property (nonatomic) NSNumber *count;

等价于

@property (nonatomic, assign) NSNumber *count;

unsafe_unretained,声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。与assign几乎等价

strong:标识一中拥有关系

weak:标识一种非拥有关系,weak 必须用于 OC 对象

(4) getter=<name>,setter=<name>

setter方法不常用,如果一个以init为开头的属性,重写其setter方法的时候,系统会把init开头的方法当成初始化方法,所以要使用setter方法

(5)nonnull,null_resettable,nullable

__nullable指代对象可以为NULL或者为NIL

__nonnull指代对象不能为null

NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END 在这两个宏之间的代码,所有简单指针对象都被假定为nonnull

@property **的本质是 **

```@property = ivar + getter + setter;

(“属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)。

)```

property在runtime中是objc_property_t定义是一个结构体


struct  property_t {

  const  char *name;

  const  char *attributes;

};

而attributes本质是objc_property_attribute_t,定义了property的一些属性,定义如下:


/// Defines a property attribute

typedef  struct {

  const  char *name; /**< The name of the attribute */

  const  char *value; /**< The value of the attribute (usually empty) */

} objc_property_attribute_t;

我们定义一个string的property@property (nonatomic, copy) NSString *string;,通过 property_getAttributes(property)获取到attributes并打印出来之后的结果为T@"NSString",C,N,V_string

其中T就代表类型,可参阅Type Encodings,C就代表Copy,N代表nonatomic,V就代表对于的实例变量。


@interface  Person : NSObject

@property  NSString *firstName;

@end

等价于

@implementation  Person

@synthesize firstName = _myFirstName;

@end

属性实现

  1. OBJC_IVAR_$类名$属性名称 :该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表示该变量距离存放对象的内存区域的起始地址有多远。
  2. setter 与 getter 方法对应的实现函数
  3. ivar_list :成员变量列表
  4. method_list :方法列表
  5. prop_list :属性列表

当我们增加一个属性的时候,系统会在成员变量列表中增加一个实例变量,然后在方法列表里增加setter和getter方法,在属性列表里增加属性描述,在偏移量里增加偏移量

@synthesize****和****@dynamic

本质上:都是 var = _var

@syntheszie 如果没有实现setter和getter方法或者没有实现其中一个,编译器会自动给加上

@synthesize 合成实例变量的规则,有以下几点:

  1. 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
  2. 如果这个成员已经存在了就不再生成了.
  3. 如果是 @synthesize foo; 还会生成一个名称为foo的成员变量,也就是说:

如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,

  1. 如果是 @synthesize foo = _foo; 就不会生成成员变量了.

@dynamic****则不会,需要手动加上****setter****和****getter****方法。

@protocol category 中如何使用 @property

  1. 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性
  2. category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:
  3. objc_setAssociatedObject
  4. objc_getAssociatedObject
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容

  • 五月天 - 精彩音乐汇 对于一个不算真正意义的基督教徒来讲,我一直对那些疯狂的信徒有着某种程度的难以理解。我一直觉...
    想太多小姐r阅读 235评论 0 1
  • 下午,翻看中医学的教材,我发现一段很好的文字,音乐可以养生,可以美容。于是听着一段音乐心情愉悦地整理了出来,给文友...
    梦在我心梦语中阅读 318评论 0 1
  • 本以为早已习惯一个人的日子。 一个人去吃饭 一个人去看电影 一个人去田径场 本以为早已习惯一个人的日子,但看到...
    even_j阅读 168评论 0 0
  • 你窗前那簇木槿开花了 想告诉你 打开窗户 世界明亮
    翔于阅读 328评论 1 4
  • 你给得了对方一个拥抱一个亲吻一张床,却给不了爱。 道理都懂,可是偏偏不想听。你很好,可是偏偏不喜欢。你看,偏偏就是...
    萘小鱼阅读 966评论 0 1