2016-07-14 3 views
-1

나는 obj-c/swift arc 시스템을 연구 중이다. 인쇄 로그온은 CFGetRetainCount func에 의해 생성 된 인스턴스의 수를 유지합니다.Obj-C 인스턴스에 보유 개수가 1 인 이유 왜 막 생성 되었습니까?

나는 기본적으로

print(CFGetRetainCount(NSObject())) // retain count 1 

..이

let foo1 = NSObject() // foo1 retain count 1 
let foo2 = foo1  // foo1 retain count 2 
foo2 = nil    // foo1 retains count 1 
foo1 = nil    // foo1 retain count 0. release 

같은 참조 카운트를 예상하지만 실제로 ..

let foo1 = NSObject() // foo1 retain count 2 
let foo2 = foo1  // foo1 retain count 3 
foo2 = nil    // foo1 retain count 2 
foo1 = nil    // foo1 retain count 1. release 

및 인쇄 NSObject의의 수를 유지

() 직접 NSObject의 ()에는 보유 수가 1입니다. 유지 카운트가 2에 도달하면 오브젝트를 해제하십시오.

인스턴스와 강하게 링크 할 때 증가 보유 수를 압니다. 하지만 방금 생성 된 인스턴스는 보유 개수가 1 일 때 1 개의 보유 개수 및 인스턴스를 가지며 0이 아닌 경우 이러한 현상의 원인은 무엇입니까?

+2

'foo1','foo2'가 상수이기 때문에 * 컴파일되지 않습니다. 변수로 선언하더라도 'nil'을 지정할 수 없습니다. 너 정말로 뭘 시험 했니? –

+0

CFGetRetainCount가 개체 보유 수에 대한 저를 보여줄 수 있다고 생각하지 않습니다. 간단한 코드를 시도해보십시오 : var foo1 : NSNumber? = NSNumber (값 : 0) print (CFGetRetainCount (foo1)). 매우 큰 숫자를 인쇄합니다 – larva

+1

코드에 대한 질문을하고 있습니다. 당신이 물어 보는 코드를 게시하는 것이 보통의 예의이며, 그 자리에서 방금 만든 코드가 아닙니다. – gnasher729

답변

2

나는 obj-c/swift arc 시스템을 연구한다.

ARC 및 카운트 기능을 상위 수준에서 유지하는 방법을 이해하려고 시도하는 경우 잘못된 길로 가고 있습니다. hereherehere을 참조하십시오.

이러한 현상의 이유는 무엇입니까?

컴파일러에서 ARC는 매우 복잡한 시스템으로, 많은 최적화 계층의 기초가됩니다. 실제 보유 카운트 값을 이해하는 것은 어렵습니다. 또한 최적화 수준의 영향을받습니다.

실제로 다이빙을 더 잘하려면 스위프트에서 paper on ARC을 사용하십시오.

2

TL; DR 당신이 결과에 영향을 미칠 수 있습니다 로그인하는 방법, 당신은 그러므로 1

다음 대답으로 모든 인쇄 결과를 증가 로그인 임시 소유권을 얻을 수 있습니다 당신 때문에 단순화 retainCount의 실제 가치에 대해 실제로 걱정하지 않아야합니다.

보유 수는 주어진 개체의 참조 (소유자) 수를 유지합니다. 만들 때 정확하게 하나의 소유자가 있으므로 보유 수는 1로 설정됩니다. 개체가 새 소유자 (retain)를 얻을 때마다 보유 수는 1 씩 증가합니다. 객체가 손실되고 소유자 (release)가 될 때마다 보유 수는 1 씩 감소합니다.

retainCount은 절대로 0에 도달 할 수 없습니다. 소유자 수가 1이고 소유자를 잃어 버리면 개체가 할당 취소되고 카운트가 줄어들지 않습니다.

var foo1: TestObject? = TestObject() 
print("#") 
print(CFGetRetainCount(foo1)) 
var foo2 = foo1 
print("#") 
print(CFGetRetainCount(foo1)) 
foo2 = nil 
print("#") 
print(CFGetRetainCount(foo1)) 
foo1 = nil 

결과 : 대신 NSObject가의 스위프트 그것을

@implementation TestObject 

- (instancetype)init { 
    TestObject *result = [super init]; 

    NSLog(@"Retain count after creation: %@", @(self.retainCount)); 

    return result; 
} 

- (instancetype)retain { 
    TestObject *result = [super retain]; 
    NSLog(@"Retain count after retain: %@", @(self.retainCount)); 

    return result; 
} 

- (oneway void)release { 
    NSLog(@"Retain count before release: %@", @(self.retainCount)); 

    [super release]; 
} 

- (void)dealloc { 
    NSLog(@"Retain count before dealloc: %@", @(self.retainCount)); 
    [super dealloc]; 
} 

@end 

및 사용 :

더 나은 테스트를 위해, 나는 ARC없이 컴파일,의 Obj-C 클래스를 만들었습니다

Retain count after creation: 1 
# 
Retain count after retain: 2 
2 
Retain count before release: 2 
Retain count after retain: 2 
# 
Retain count after retain: 3 
3 
Retain count before release: 3 
Retain count before release: 2 
# 
Retain count after retain: 2 
2 
Retain count before release: 2 
Retain count before release: 1 
Retain count before dealloc: 1 

기본적으로 기대하는 바는 있지만 추가 보유 및 함수에 객체를 전달할 때 임시 소유권을 얻을 때마다 CFGetRetainCount을 배포합니다.

retainCount의 값을 절대로 읽지 말아야하는 사례 중 하나입니다. 디버깅 값이 없으며 documentation에 언급되어 있습니다.

0

간단히 말해서 : 보유 숫자가 0이되면 개체가 사라 지므로 (따라서 보유 수를 묻는 개체가 없기 때문에) 은 적어도 1이어야합니다.

더 긴 대답은 친구 세 전에 내가했던이 비디오를 수 있습니다 : https://www.youtube.com/watch?v=cBN--I31Xjo

하지만 ARC를 사용하는 경우 정말, 당신은 유지 수를 보면 안된다. ARC는 필요에 따라 보관을 삽입하며 나중에 5 번 릴리스하는 경우 ARC가이 시점에서 개체를 5 번 유지할 수 있습니다.

-retainCount 또는 CFGetRetainCount()에 문제가있어

: 유지 카운트의 요점 소유권을 공유하고 있기 때문에, 당신은 다른 참조를 소유하고있는 사람 신경 안, 당신은 당신의 코드가 보유하고 얼마나 많은 참조에 대해 관심을 가져야하고 제대로을 준다 순환적인 강력한 참조가 없음을 보장함으로써