문제

Objective-C에서 표준 점 표기법이나 메서드 호출을 사용하여 Objective-C에서 개체의 속성에 액세스할 수 있습니다.

myObject.property = YES;

또는

[myObject setProperty:YES];

성능에 차이가 있나요(속성 액세스 측면에서)?코딩 스타일 측면에서 단지 선호의 문제일까요?

도움이 되었습니까?

해결책

Objective-C의 속성 액세스에 대한 점 표기법 ~이다 대괄호 표기와 마찬가지로 메시지를 보냅니다.즉, 다음과 같이 가정합니다.

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

마지막 두 줄은 정확히 동일하게 컴파일됩니다.이를 변경하는 유일한 것은 속성에 다음이 있는 경우입니다. getter 및/또는 setter 속성이 지정되었습니다.그러나 수행하는 작업은 메시지 전송 여부가 아니라 전송되는 메시지를 변경하는 것뿐입니다.

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

마지막 두 줄은 모두 동일하게 컴파일됩니다.

다른 팁

확인해 보세요 코코아는 내 여자친구 기사.요점은 하나를 다른 것보다 사용해도 성능 저하가 없다는 것입니다.

그러나 표기법을 사용하면 변수에 무슨 일이 일어나고 있는지, 변수가 무엇인지 확인하기가 더 어렵습니다.

성능 차이를 확인할 수 있는 유일한 경우는 속성을 "비원자적"으로 표시하지 않은 경우입니다.그런 다음 @synthesize는 속성 설정 주위에 동기화 코드를 자동으로 추가하여 스레드로부터 안전한 상태를 유지하지만 설정 및 액세스 속도가 느려집니다.

따라서 대부분 다음과 같은 속성을 정의하고 싶을 것입니다.

@property(비원자, 유지) NSString *myProp;

개인적으로 나는 올바른 setter 메소드 작성에 대해 생각할 필요가 없다는 관점에서 점 표기법이 일반적으로 유용하다고 생각합니다. 이는 이전 값을 적절하게 해제하는 것도 기억해야 하기 때문에 비원자 setter의 경우에도 완전히 사소한 것은 아닙니다.템플릿 코드를 사용하면 도움이 되지만 항상 실수할 수 있으며 일반적으로 클래스를 복잡하게 만드는 반복적인 코드입니다.

주의해야 할 패턴:(@synthesize가 생성하도록 하는 대신) setter를 직접 정의하고 값 설정의 다른 부작용이 발생하기 시작하면 속성 표기법을 사용하여 호출하는 대신 setter를 일반 메서드로 만들어야 할 것입니다.

의미론적으로 속성을 사용하는 것은 호출자에게 실제 값에 직접 액세스하는 것처럼 보이며, 그와 다른 모든 작업은 속성에 액세스하는 것이 아니라 메시지 전송을 통해 수행되어야 합니다(실제로 둘 다 메시지를 보내는 경우에도).

제가 본 바로는 둘 사이에 큰 성능 차이는 없었습니다.나는 대부분의 경우 동일한 코드로 '컴파일'될 것이라고 합리적으로 확신합니다.

확실하지 않은 경우 각 메서드를 백만 번 정도 수행하는 테스트 애플리케이션을 작성하면서 시간이 얼마나 걸리는지 측정해 보세요.이것이 확신을 가질 수 있는 유일한 방법입니다(아키텍처에 따라 다를 수 있음).

Cocoa with Love에 대한 이 블로그 게시물도 읽어보세요.

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

거기서 저자는 NSManagedObject에 대한 사용자 정의 접근자와 점 표기법의 속도를 비교하고 차이를 찾지 못했습니다.그러나 KVC 액세스(setValue:forKey:)는 약 2배 느린 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top