Как система точек останова Xcode взаимодействует с управлением памятью? - PullRequest
0 голосов
/ 07 февраля 2019

Вот небольшой эксперимент:

@interface Model : NSObject

@property (copy) NSString *value;

-(instancetype)initWith:(NSString *)value;

@end

@implementation Model

-(instancetype)initWith:(NSString *)value {
    self = [super init];
    self.value = value;
    return self;
}

@end

#import <Foundation/Foundation.h>
#import "Model.h"

void experiment(Model *m);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");

        Model *ma = [[Model alloc] initWith:[[NSUUID UUID] UUIDString]];

        experiment(ma);
        NSLog(@"yyy %@", [ma value]);
    }
    return 0;
}

void experiment(ModelA *m) {
    NSString *testValue = nil;
    testValue = [m value];
    NSLog(@"xxx %@", testValue);
}

При запуске получается следующее:

Hello, World!
xxx 6005A7B0-F71C-4755-B1BF-792D6296B716
yyy 6005A7B0-F71C-4755-B1BF-792D6296B716
Program ended with exit code: 0

Но предположим, что я сделал эту строку:

testValue = [m value];

часть точки останова:

enter image description here

И это меняет все:

Hello, World!
(__NSCFString *) $0 = 0x000000010071e220 @"1C0DCB39-BFBB-4E67-A041-E6B58615BDFD"
xxx 1C0DCB39-BFBB-4E67-A041-E6B58615BDFD
yyy 1C0DCB39-BFBB-4E67-A041-E6B58615BDFD
*** -[CFString release]: message sent to deallocated instance 0x10071e220

И сбой.Я вижу, что происходит - строка освобождается, когда мы покидаем область действия функции, и второй раз, когда объект Model уничтожается, что является чрезмерным выпуском.Но почему точка останова (или, точнее, выражение lldb внутри точки останова) правильно обрабатывает счетчик ссылок?

...