programing

@synthe size는 정확히 어떤 역할을 합니까?

instargram 2023. 4. 12. 21:46
반응형

@synthe size는 정확히 어떤 역할을 합니까?

다음과 같은 코드를 보았습니다.

//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;

//example.m
@synthesize mapView = mapView1

와의 관계는 무엇입니까?mapView ★★★★★★★★★★★★★★★★★」mapView1이됩니까?set ★★★★★★★★★★★★★★★★★」get의 for의 mapView1

예에서는 " " 입니다.mapView1인스턴스 변수(ivar)로, 에서 정의되어 있는 클래스의 인스턴스에 속하는 메모리스토리지의 일부입니다.example.h ★★★★★★★★★★★★★★★★★」example.mmapView는 속성 이름입니다.속성은 점 표기법을 사용하여 읽거나 설정할 수 있는 개체의 속성입니다.myObject.mapView속성은 ivar를 기반으로 할 필요는 없지만 대부분의 속성은 ivar를 기반으로 합니다.@property선언은 단순히 세계에 라고 불리는 속성이 있다고 말한다.mapView.

@synthesize mapView = mapView1;

"setter"의 하도록 지시합니다.mapView 이바르라는 mapView1 포함이 없는 = mapView1컴파일러 는 (이)라는 이름의 ivar가 에 컴파일러 합니다.이바르, 이바르, 이바르mapView

결과 ★★★★★@synthesize은 사용자가.

-(MKMapView *)mapView
{
   return mapView1;
}

-(void)setMapView:(MKMapView *)newMapView
{
  if (newMapView != mapView1)
  {
    [mapView1 release];
    mapView1 = [newMapView retain];
  }
}

하면, 「」를 할 수 .@synthesizewith 붙은 스테이트먼트.

@dynamic mapView;

중요한 것은 ivars와 properties 사이에 매우 명확한 개념적 구분이 있어야 한다는 것입니다.그들은 정말로 매우 다른 두 개념이다.

@synthesize셋터

를 통해 몇 Atribut을 할 수 또, 「」를 지정하면,@synthesize세터

속성 이름은 변수 이름과 같을 수 있습니다. 때도 요.init ★★★★★★★★★★★★★★★★★」dealloc또는 매개 변수가 동일한 변수 이름으로 전달되는 경우.

매뉴얼에서 다음 항목을 참조하십시오.

@synthesize 키워드를 사용하여 컴파일러에 @implementation 블록 내에 setter 및/또는 getter 메서드를 제공하지 않을 경우 해당 메서드를 컴파일러에 합성해야 함을 알립니다.

레거시 코드를 편집할 때 이 문제가 발생했기 때문에 기존 답변에 주의해야 할 사항을 메모하고 싶습니다.

새로운 컴파일러 버전에서도 생략하거나 생략하지 않으면 차이가 날 수 있습니다.

인스턴스 변수를 합성하면서 언더스코어 없이 선언하는 경우 다음과 같습니다.

머리글:

@interface SomeClass : NSObject {
   int someInt;
}
@property int someInt;
@end

구현:

@implementation SomeClass
@synthesize someInt;
@end

self.someInt와 같은 변수에 액세스 합니다.someIntivar에 선행 언더스코어를 사용하지 않는 것은 명명규칙에 준거하지 않습니다만, 그러한 코드를 읽고 수정하지 않으면 안 되는 상황이 되었습니다.

그러나 "새로운 컴파일러를 사용하기 때문에 @synthe size는 더 이상 중요하지 않습니다."라고 생각한다면 오산입니다.그러면 당신의 클래스는 2개의 ivar를 갖게 됩니다.someInt+ 자동 생성_someInt변수.따라서self.someInt그리고.someInt는 더 이상 같은 변수를 다루지 않습니다.만약 당신이 나처럼 그런 행동을 기대하지 않는다면, 이것은 당신이 알아내기 위해 약간의 두통을 가져올 것입니다.

Apple 문서에 따르면 @Synthe size는 인스턴스 변수의 이름을 변경하는 데만 사용됩니다.예를들면

@property NSString *str;

@synthesize str = str2; 

이제 수업에서 당신은 사용할 수 없습니다._str위의 행이 인스턴스 변수의 이름을 로 변경했기 때문에str2

@property는 오브젝트를 다른 클래스의 오브젝트에 의해 사용할 수 있도록 합니다.즉, 오브젝트를 공개합니다.

@interface에서 속성을 생성하면 _propertyName이라는 이름의 인스턴스 변수에 의해 해당 속성이 자동으로 돌아갑니다.따라서 firstName이라는 이름의 속성을 만들면 씬 컴파일러 뒤에 _firstName이라는 이름의 인스턴스 변수가 기본적으로 생성됩니다.컴파일러는 getter 및 setter 메서드(firstName, setFirstName)도 만듭니다.

이제 @synthize firstName으로 속성을 합성하면 컴파일러가 내 인스턴스 변수(_firstName)의 이름을 firstName으로 변경하도록 지시합니다.백업된 인스턴스 변수의 이름을 다른 이름으로 바꾸려면 속성 이름(예: @size firstName = myFirstName)을 합성하면서 다른 이름을 할당하기만 하면 됩니다. 이렇게 하면 속성이 myFirstname이라는 인스턴스 변수에 의해 백업됩니다.

즉, 대부분의 시간 @synthesize는 속성으로 백업된 인스턴스 변수의 이름을 변경하는 데 사용됩니다.

Apple 문서 참조

기본적으로 합성에서는 mapView1을 설정하고 취득하는 setMapView 및 mapView 메서드가 생성됩니다.

오브젝트의 getter와 setter를 만듭니다.다음과 같은 방법으로 에 액세스 할 수 있습니다.

MKMapView* m = object.mapView;

또는

object.mapView = someMapViewObject

mapView1은 클래스 내 ivar 이름, mapView는 getter/setter 메서드 이름입니다.

언급URL : https://stackoverflow.com/questions/3266467/what-exactly-does-synthesize-do

반응형