iOS 开发 Objective-C

iOS 底层 day25 内存管理 MRC copy

2020-09-23  本文已影响0人  望穿秋水小作坊

一、MRC

1. MRC基本介绍
2. 内存泄露是什么意思?
3. 请在 MRC 下,实现 Person 对象有一条Dog,调用Dogrun 方法,最后 DogPerson 都被释放。
#import "Person.h"
@interface Person : NSObject
{
    Dog *_dog;
}
- (Dog*)dog;
- (void)setDog:(Dog*)dog;
@end
#import "Person.h"
@implementation Person
- (void)setDog:(Dog*)dog{
    _dog = dog;
    [_dog retain];
}
- (Dog*)dog {
    return _dog;
}
- (void)dealloc
{
    NSLog(@"%s", __func__);
    [_dog release];
    [super dealloc];
}
@end
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        Dog* dog1 = [[Dog alloc] init];
        person.dog = dog1;
        [dog1 release];
        [person.dog run];
        [person release];
    }
    NSLog(@"2");
    return 0;
}
4. 思考我们如下修改 Person.m 可以解决问题吗?
#import "Person.h"
@implementation Person
- (void)setDog:(Dog*)dog{
   [_dog release];
    _dog = [dog retain];
}
- (Dog*)dog {
    return _dog;
}
- (void)dealloc
{
    NSLog(@"%s", __func__);
    [_dog release];
    [super dealloc];
}
@end
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        Dog* dog1 = [[Dog alloc] init]; // 1
        person.dog = dog1; // 2
        [dog1 release]; // 1
        person.dog = dog1; // 内部 set 方法将 `dog1` 的引用计数器释放到 `0`
        [person.dog run];
        [person release];
    }
    NSLog(@"2");
    return 0;
}
5. 针对上一个问题,我们如何继续完善代码?
#import "Person.h"
@implementation Person
- (void)setDog:(Dog*)dog{
    if (_dog != dog) {
        [_dog release];
        _dog = [dog retain];
    }
}
- (Dog*)dog {
    return _dog;
}
- (void)dealloc
{
    NSLog(@"%s", __func__);
    [_dog release];
    [super dealloc];
}
@end
6. 补充介绍:什么是 Xcode 的 Zombie Objects 僵尸对象检查功能?

二、 copy

1. 拷贝的目的(记住这个,可以帮助我们理解很多代码层次的知识)
2. iOS 提供了 2 个拷贝的方法
3. 深拷贝和浅拷贝
4. copymutableCopyNSArray、NSMutableArray、NSString、NSMutableString、NSDictionary、NSMutableDictionary 的效果有什么不同?
`copy` 和 `mutableCopy` 效果图
5.思考下面这句代码写法有问题吗?
@property(copy, nonatomic) NSMutableArray *data;
6.为什么字符串普遍都用 copy 修饰呢?
UITextField 中字符串的修饰
7. 对于 Foundation 框架内部有许多类为我们实现了 copymutableCopy,那如果对于我们自定义的类,比如 Person 调用 copy 会有效果吗?
- (id)copyWithZone:(NSZone *)zone {
    Person *person = [[Person allocWithZone:zone] init];
    person.age = self.age;
    person.weight = self.weight;
    return person;
}
上一篇 下一篇

猜你喜欢

热点阅读