Вот небольшой эксперимент:
@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];
часть точки останова:
И это меняет все:
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 внутри точки останова) правильно обрабатывает счетчик ссылок?