ARC를 사용한 @property 정의 : 강함 또는 유지?


80

Xcode 4.2 및 ARC를 사용하면 자동 생성 코드 NSManagedObject가 속성에 대해 다음과 같이 읽히는 것을 알 수 있습니다.

@property (nonatomic, retain) NSString * someString;

1) retain이제 strong또는 로 대체 해서는 안됩니다.weak 됩니까?

2) 자동 생성 코드가 여전히 사용하는 이유 retain

3) 올바른 대체품은 무엇입니까? retain 이 속성 설명에서 ?

현재을 사용하여 문제를 디버깅 중이며 이것이 문제 NSFetchRequest의 원인 일 수 있다고 생각했습니다. 생각?


지금 쯤이면 대답을 받아 들여야합니다.
Rivera 2014 년

답변:


110

1) 유지는 이제 강하거나 약한 것으로 대체해서는 안됩니까?

아니요. 유지를 약한 것으로 대체 할 수 없습니다. 그들은 달라. 그리고 strong은 보유의 100 % 동의어입니다. 그들은 동일합니다. 둘 중 하나를 사용할 수 있으므로 여기에 "should"가 없습니다. 원하는 경우 유지를 strong으로 바꿀 수 있지만 반드시 그럴 필요는 없습니다.

2) 자동 생성 된 코드가 여전히 유지를 사용하는 이유

왜 안돼? (1) 참조. 유지가 정확하므로 문제가 없습니다.

3)이 재산 명세서에서 유보에 대한 올바른 대체는 무엇입니까?

유지를 교체 할 필요가 없습니다.

현재 NSFetchRequest를 사용하여 문제를 디버깅 중이며 이것이 문제의 원인 일 수 있다고 생각했습니다. 생각?

그렇지 않습니다.


9
그러나 표준 및 Apple Way 준수에 집착하는 커뮤니티의 경우 합성 된 모델에서만 유지하는 것이 비싸다고 생각합니다. 현학적 인 것만으로 강하게 바뀝니다. 우선, 부적절한 구문에 대한 대규모 프로젝트를 확인하는 것이 6 가지 다른 사소한 것 중에서도 조금 더 쉽습니다.
Eric Goldberg 2011

12
감성 아키텍처가 정확히 무엇인지 확실하지 않습니다. "낮의 차갑고 맑은 빛"에서 예를 들어 줄 수 있습니까? ;-) false와 NO는 동의어이지만 Objective-C에서는 규칙에 따라 NO를 사용합니다. 일관성을 유지하는 데에는 이유가 있습니다. 일관성이 없다는 것은 괜찮지 만, 합당 성을 증명하는 부담은 규칙을 고수하는 것이 아니라 하나의 위반 규칙에 있습니다.
Eric Goldberg 2011

9
모든면에서 @EricGoldberg는 규칙이 중요합니다. __strong코드의 다른 위치에 있을 것이기 때문에 (없음 __retain) strong일관성 을 위해 사용으로 전환 할 수 있습니다 . 이것은 코드가 이것이없이 잘 실행 되더라도 일관된 방식으로 코드를 들여 쓰기하는 것과 유사합니다.
Dan Rosenstark 2011

3
@matt : 내가 "감정적으로"코딩했다고 비난했던 내 원래 댓글을 보면 (그게 뭐든간에) 내가 "posit"과 "just to be pedantic"이라는 단어를 사용한다는 것을 알 수있을 것입니다. 나는 사실 "해야"가 아니라 "해야"를 제안합니다.
Eric Goldberg 2011

1
모든 프로그래밍은 관용구에 관한 것입니다. 다른 문제는 없습니다. 모든 프로그래밍은 동의어이며, 프로그래밍의 전체 엔지니어링 관행은 클라이언트를위한 코드에 가치를 추가하기 위해 현재 관용구를 사용하는 것입니다.
Fattie 2014-01-22

40

하나에서 세 가지 질문에 대답하려면 다음 retainstrong모두가 올바른지, 그래서 서로 동의어입니다. 문서 상태

retain__strong소유권을 의미

strong__strong소유권을 의미


응답 해 주셔서 감사합니다. ARC에서 Apple 문서를 읽었습니다. 유지가 강하다는 것을 이해합니다. 그러나 이것은 새로운 NSManagedObject (s)를 만들 때 Xcode에 의해 자동으로 생성되는 코드가 왜 @property (비원
자성

3
내가 여기서 뭔가를 놓치고 있지 않는 한 완벽하게 설명합니다. Xcode가 생성하는 코드는 retain이 강력하게 작동하기 때문에 정확합니다. 그렇다면 질문은 어디에 있습니까?
Phlibbo

6
프로젝트에서 ARC 리팩토링을 실행하면 모든를 retains 로 변환합니다 strong. 그래서 내 인상은 이것이 strong선호되는 속성이지만 NSManagedObject 생성기가 업데이트되지 않았습니다. 그러나 그것은 단지 추측 일뿐입니다. 애플의 아무도 구별을 중요하게 여기지 않을 수도 있습니다.
이론

4

ARC 이전에 유지되는 객체를 '해제'해야합니다. 즉, 보유에는 반대 부분이 있습니다. ARC 후에는 해제 할 필요가 없습니다. 따라서 강력하게 사용하십시오. 릴리스를 호출 할 필요가 없다는 시각적 단서입니다.


3

"retain"은 "strong"과 같습니다.

예를 들어 "strong"이 사용됩니다.

@property (nonatomic, strong) NSString * someString;

예를 들어 "__strong"이 사용됩니다.

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

Apple 문서에서. 말한다 :

속성 속성

다음 예제와 같이 weak 및 strong 키워드가 새로 선언 된 속성 속성으로 도입됩니다.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Apple doc. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.