development

@synthesize는 정확히 무엇을합니까?

big-blog 2020. 6. 14. 09:39
반응형

@synthesize는 정확히 무엇을합니까?


다음 코드 조각을 보았습니다.

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

//example.m
@synthesize mapView = mapView1

mapView의 관계는 무엇입니까 mapView1? 에 대한 setget메소드를 작성합니까 mapView1?


귀하의 예 에서 및에 정의 된 클래스의 인스턴스에 속하는 메모리 저장소 mapView1인스턴스 변수 (ivar)가 있습니다. 속성 의 이름입니다 . 속성은 점 표기법을 사용하여 읽거나 설정할 수있는 객체의 속성입니다 . 속성은하지 않습니다 바르 기반으로 할 수 있지만, 대부분의 속성이다. 선언은 단순히라는 속성이 있음을 세계에 알려줍니다 .example.hexample.mmapViewmyObject.mapView@propertymapView

@synthesize mapView = mapView1;

이 줄은 컴파일러에게에 대한 setter 및 getter를 작성하고 mapView라는 ivar을 사용해야한다고 지시합니다 mapView1. = mapView1부분이 없으면 컴파일러는 속성과 ivar의 이름이 같다고 가정합니다. (이 경우 ivar이 없기 때문에 컴파일러 오류가 발생합니다 mapView.)

@synthesize문장 의 결과는 이 코드를 직접 추가 한 경우와 비슷합니다.

-(MKMapView *)mapView
{
   return mapView1;
}

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

해당 코드를 클래스에 직접 추가하면 @synthesize명령문을

@dynamic mapView;

가장 중요한 것은 ivar와 속성을 매우 명확하게 개념적으로 구분하는 것입니다. 그들은 실제로 두 가지 매우 다른 개념입니다.


@synthesize 변수에 대한 getter 및 setter를 작성합니다.

이를 통해 변수에 대한 일부 속성을 지정할 수 있으며 해당 특성을 변수에 지정 @synthesize하면 변수에 대한 getter 및 setter가 생성됩니다.

특성 이름은 변수 이름과 동일 할 수 있습니다. 때때로 사람들이 그것을 사용하기 위해이 다를 수하고자 init하거나 dealloc또는 매개 변수가 같은 변수의 이름으로 전달 될 때.


에서 문서 :

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


레거시 코드를 편집 할 때이 문제가 발생하면 알고 있어야하는 기존 답변에 추가 메모를하고 싶습니다.

최신 컴파일러 버전을 사용하더라도 생략 @synthesize propertyName하거나 생략하면 차이가 발생하는 경우가 있습니다 .

이 경우 , 밑줄 없이 인스턴스 변수를 선언하면서 인스턴스 변수 를 계속 합성합니다 (예 :

헤더:

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

이행:

@implementation SomeClass
@synthesize someInt;
@end

self.someInt와 같은 변수에 액세스합니다 someInt. ivars에 밑줄을 사용하지 않으면 명명 규칙을 따르지 않지만 그러한 코드를 읽고 수정 해야하는 상황에 빠졌습니다.

But if you now think "Hey, @synthesize is not important any more as we use a newer compiler" you are wrong! Your class then will result in having two ivars, namely someInt plus an autogenerated _someInt variable. Thus self.someInt and someInt will not address the same variables any more. If you don't expect such behavior as I did this might get you some headache to find out.


As per apple documentation @Synthesize is used only to rename instance variables. For example

@property NSString *str;

@synthesize str = str2; 

Now in the class you can not use _str as the above line has renames the instance variable to str2

@property allows objects to be used by objects in other classes, or in other words makes the object public.


When you create a property in @interface, that property will be automatically back by an instance variable named as _propertyName. So when you create a property named as firstName, behind the scene compiler will create an instance variable named as _firstName by default. Compiler will also create the getter and setter method for you(i.e. firstName, setFirstName).

Now when you synthesize the property by @synthesize firstName, you are simply telling the compiler rename my instance variable(_firstName) by firstName. If you want to rename your backed up instance variable by different name you can simply assign different name while synthesizing the property name(i.e. @synthesize firstName = myFirstName), by doing this your property is backed up by an instance variable named as myFirstname.

So, in short, most of the time @synthesize used to rename your instance variable backed up by your property.


See the apple docs

Basically the synthesize creates a setMapView and mapView methods which set and get mapView1


It creates getter and setter for your object. You can access with something like this :

MKMapView* m = object.mapView;

or

object.mapView = someMapViewObject

mapView1 is the name of the ivar in the class, mapView is the name for the getter / setter method(s).

참고URL : https://stackoverflow.com/questions/3266467/what-exactly-does-synthesize-do

반응형