2014-05-21 4 views
-1
NSString *strongObj = [[NSString alloc] init]; //alloc and initialze a new instance 
strongObj = @"some value"; //set value to a instance 
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj 

strongObj = nil; //set strong object to nil and remove it from memory 

strongObj = @"some value 2"; //assign a different value to strong obj 

weakObj ; // weak obj still holds // @"some value" // this value event i've set the week obj pointer to nil 

pls 위의 코드와 주석을 살펴보면 주석은 제 관점/가정입니다. Pls는 명확히합니다.iOS 설명에서 강력하고 약한 속성

감사

+0

약한 개체는 수명 및 범위가있을 때까지 값을 보유합니다. 범위 ({및}) 다음에는 자동 완성되고 로컬 또는 가장 가까운 autoreleasepool에 추가됩니다. 할당 해제/해방됩니다. –

+0

수천 개의 중복 코드가있을 수 있습니다. [Objective-C ARC : 강력한 대 유지 및 약한 대 할당] (http://stackoverflow.com/questions/8927727/objective-c-arc-strong-vs-retain-and-weak -vs-assign) –

답변

0

, 당신은 실제로 동일한 인스턴스를 사용하지 않는,하지만입니다 @"some value" 문자열 리터럴, 어떤 주소로 포인터를 재 할당된다. 이는 코드의 첫 번째 줄에 할당 한 것과 동일한 인스턴스가 아닙니다.

이제 weakObj을 할당하면 실제로 동일한 문자열 리터럴 @"some value"을 가리킬 것입니다.

기본적으로 어떤 일이 발생합니까? weakObjstrongObj을 따르지 않지만 할당 해제되지 않은 문자열 리터럴을 따르고 있습니다. 그렇기 때문에 strongObjnil으로 설정되어있는 동안 여전히 "값"이 표시됩니다.

0

문자열 리터럴은 항상 살아 런타임에서 해제되지 않습니다. 약한 포인터는 가리키는 메모리가 할당 해제 될 때 무효화되므로 weakObj가 무효화 될 것으로 잘못 예상 할 수 있습니다.

대신 리터럴 문자열의 당신이

[[NSString alloc] initWithFormat:@"some value %d", 1]; 

전자를 사용한다, 그것이 작동되도록합니다. 지. 당신이 strongObj 인스턴스를 생성하고 있지만

NSString *strongObj = [[NSString alloc] initWithFormat:@"some value %d", 1]; //alloc and initialze a new instance 
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj 

strongObj = nil; //set strong object to nil and remove it from memory 

weakObj ; 
관련 문제