iOS 学习笔记集合

一、对象属性

对于具有可变副本的属性 (NSArrayNSStringNSDictionary),我们倾向于将其声明为 copy

比如说,我们定义 Person 对象的 name 属性的类型是 NSString,有可能有人创建了一个 Person 对象,并且给这个属性赋了一个 NSMutableString 的名字值 tempName

然后过了一会儿,这个可变字符串 tempName 被变更了。

如果我们的属性不是 copy 而是 strong 的话,随着可变字符串 tempName 的改变,我们的 Person 对象也将发生改变,这不是我们希望发生的。

例子如下:

@interface Student : NSObject

@property (copy, nonatomic) NSString *name;
//@property (strong, nonatomic) NSString *name;

@end

- (void)testStudent{
    
    //1.定义一个可变字符串 
    NSMutableString *tempName = [NSMutableString stringWithFormat:@"zhangsan"];
    
    //2.创建 Student 对象并给 name 赋值
    Student *student = [[Student alloc] init];
    student.name = tempName;
    
    //3.修改字符串
    [tempName appendString:@"22"];
 
    NSLog(@"1 tempName:%p - name:%p", tempName, student.name);
    NSLog(@"2 tempName:%@ - name:%@", tempName, student.name);
}

使用 strong 修饰 name 时的输出如下:

1 tempName:0x60000147f360 - name:0x60000147f360
2 tempName:zhangsan22 - name:zhangsan22

使用 copy 修饰 name 时的输出如下:

1 tempName:0x600000af8a20 - name:0xd3c6a2453c0e238f
2 tempName:zhangsan22 - name:zhangsan

二、不可变对象

如果我们需要的是不可变对象,那么我们要确保它在被创建后就不能再被更改。

我们可以通过使用初始化方法并且在接口中将我们的属性声明为 readonly 来实现这一点。

@interface Person : NSObject<NSCopying>

@property (readonly, nonatomic) NSString *name;
@property (readonly, nonatomic) NSDate *birthDate;
@property (readonly, nonatomic) NSInteger age;

- (instancetype)initWithName:(NSString *)name birthDate:(NSDate *)birthDate age:(NSInteger)age;

@end
#import "Person.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name birthDate:(NSDate *)birthDate age:(NSInteger)age{
    
    if (self = [super init]) {
        _name = [name copy]; 
        _age = age;
        _birthDate = birthDate;
    }
    return self;
}

@end

现在我们构建新的 Person 对象和其他的类一起工作的时候,我们知道 Person 的 name 这些值是不会发生改变的。

注意:在 Person 的初始化方法或者是 dealloc 中最好使用实例变量而不要使用属性,因为你无法确定 self 调用的到底是不是你想要的实例。


三、消息传递机制

消息传递中的发送者、接收者举例:我们创建的 table view 是发送者,而它的 delegate 则是接收者。

1.NSNotification

通知的独特之处在于,发送者和接收者不需要相互知道对方,所以通知可以被用来在不同的相隔很远的模块之间传递消息。

使用场景:

  • 如果要在项目的两个不相关的模块中传递消息时,通知机制是非常好的工具。

2.Delegation

如果使用 delegation 模式的话,发送者需要知道接收者,但是反过来没有要求。

使用场景:

  • 如果只要在相对接近的两个模块间传递消息,delegation 是很灵活很直接的消息传递机制。

3.KVO

KVO 是提供对象属性被改变时的通知的机制。

使用场景:

  • 如果只对某个对象的值的改变感兴趣的话,就可以使用 KVO 消息传递。

使用前提:

  • 1.接收者(接收对象改变的通知的对象)需要知道发送者 (值会改变的对象)。
  • 2.接收者需要知道发送者的生命周期,因为它需要在发送者被销毁前注销观察者身份。

4.Block

使用场景:

  • 如果一个被调用的方法需要发送一个一次性的消息作为回复,那么使用 block 是很好的选择。
  • 如果要将处理的消息和对消息的调用放在一起来增强可读性的话,也可以使用 block。

注意:为了不出问题,我们需要保证编码器对象在某个时间点会释放对 block 的引用。
一旦任务完成,completion block 调用过了以后,我们就应该把它设为 nil。

5.Target-Action

Target-Action 消息的接收者不知道消息的发送者,并且消息的发送者也不知道消息的接收者。

使用场景:

  • Target-action 机制非常适合响应 UI 的事件,没有其他的消息传递机制能够提供相同的功能。

注意:如果 target 是明确指定的,那么 action 消息会发送给指定的对象。
如果 target 是 nil, action 消息会一直在响应链中被传递下去,直到找到一个能处理它的对象。


四、weak singleton 及使用场景

weak singleton 实现如下:

@implementation WeakSingleton

+ (instancetype)sharedInstance{
    static __weak WeakSingleton *instance;
    WeakSingleton *strongInstance = instance;
    
    @synchronized (self) {
        if (strongInstance == nil) {
            strongInstance = [[[self class] alloc] init];
            instance = strongInstance;
        }
    }
    return strongInstance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static __weak WeakSingleton *instance;
    WeakSingleton *strongInstance = instance;
    
    @synchronized (self) {
        if (strongInstance == nil) {
            strongInstance = [super allocWithZone:zone];
            instance = strongInstance;
        }
    }
 
    return strongInstance;
}

- (id)copyWithZone:(NSZone *)zone{
    return [WeakSingleton sharedInstance];
}

- (void)dealloc{
    NSLog(@"-->> %s", __FUNCTION__);
}

@end

使用场景:
weak singleton 能在不同的地方访问同一个对象,如下图:

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