수색…


통사론

  • 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 개의 속성 xy 를 가지며 다음과 같이 쓸 수 있습니다.

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에 래핑 된 결과가 반환됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow