Objective-C Language
구조물
수색…
통사론
- typedef struct { typeA propertyA ; typeB propertyB ; ...} StructName
비고
Objective C에서는 구조체 대신 객체를 사용해야합니다. 그러나 구조체를 사용하는 것이 더 나은 경우도 있습니다.
- 당신이 (struct) 타입의 많은 값을 만들고 파괴하려고 할 때 좋은 성능과 적은 메모리 사용량이 필요합니다.
- 구조체는 객체에서 메소드를 호출 할 때 런타임에 메소드를 결정해야하기 때문에 작성하고 사용하는 것이 빠릅니다.
- 객체는 클래스를 보유하는 추가 속성
isa
갖기 때문에 Structs는 크기를 줄입니다.
- 값에 몇 개의 속성과 작은 전체 크기가있을 때 (
CGSize
하면 2 개의 부동 소수점이 각각 4 바이트이므로 8 바이트를 차지할 수 있습니다.) 많이 사용하게 될 것입니다 ( 첫 번째 지점) - 유니온 이나 비트 필드를 사용할 수 있고 중요 하게도 메모리 사용량이 적기 때문에 크기를 절약 할 필요가 있습니다 (첫 번째 요점과의 연계)
- Objective-C 객체가 C- 배열을 직접 저장할 수 없기 때문에 실제로 구조체 내부에 배열을 저장하려고 할 때. 그러나 Objective-C 오브젝트에서 배열을 참조 (즉, C 배열
type[]
대신type *
로type *
하여 간접적으로 배열을 얻을 수는 있습니다 - 라이브러리와 같은 다른 코드와 통신해야 할 때 C로 코딩되어 있습니다. structs는 C에서 완전히 구현되지만 객체는 그렇지 않습니다.
CGPoint
구조체의 한 가지 좋은 예는 CGPoint
. 2 차원 점을 나타내는 간단한 값입니다. 2 개의 속성 x
와 y
를 가지며 다음과 같이 쓸 수 있습니다.
typedef struct {
CGFloat x;
CGFloat y;
} CGPoint;
이전에 Mac 또는 iOS 앱 개발을 위해 Objective-C를 사용했다면 거의 확실하게 CGPoint
접하게되었습니다. CGPoint
는 뷰와 컨트롤에서부터 게임의 오브젝트, 그라디언트의 변화에 이르기까지 화면의 거의 모든 것의 위치를 유지합니다. 이것은 CGPoint
가 많이 사용된다는 것을 의미합니다. 이것은 실제로 성능이 높은 게임에서 더욱 그러합니다. 이 게임들은 많은 물체를 가지고있는 경향이 있으며,이 모든 물체는 위치를 필요로합니다. 이 위치는 CGPoint
또는 포인트를 전달하는 다른 유형의 구조체 (예 : 3D 게임의 3 차원 점)입니다.
CGPoint
와 같은 점은 다음과 같이 쉽게 객체로 나타낼 수 있습니다.
@interface CGPoint {
CGFloat x;
CGFloat y;
}
... //Point-related methods (e.g. add, isEqualToPoint, etc.)
@property(nonatomic, assign)CGFloat x;
@property(nonatomic, assign)CGFloat y;
@end
@implementation CGPoint
@synthesize x, y;
...
@end
그러나 CGPoint
를 이런 식으로 사용하면 점을 만들고 조작하는 데 시간이 오래 걸립니다. 더 작고 빠른 프로그램에서는 이것이 실제로 차이를 일으키지 않을 것이며, 그러한 경우에는 객체 점을 사용하는 것이 좋을 수도 있고 더 좋을 수도 있습니다. 그러나 포인트가 많이 사용되는 대규모 프로그램에서 오브젝트를 포인트로 사용하면 성능이 크게 저하되고 프로그램이 느려지고 메모리가 낭비되어 프로그램이 중단 될 수 있습니다.
구조체 정의 및 구조체 멤버 액세스
struct 문 형식은 다음과 같습니다.
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
예 : ThreeFloats 구조체를 선언하십시오.
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end
MyClass의 인스턴스를 valueForKey :라는 메시지를 @ "threeFloats"매개 변수와 함께 보내면 myClass 메서드 threeFloats가 호출되고 NSValue에 래핑 된 결과가 반환됩니다.