@synthesize는 정확히 무엇을합니까?
다음 코드 조각을 보았습니다.
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
mapView
과 의 관계는 무엇입니까 mapView1
? 에 대한 set
및 get
메소드를 작성합니까 mapView1
?
귀하의 예 에서 및에 정의 된 클래스의 인스턴스에 속하는 메모리 저장소 mapView1
인 인스턴스 변수 (ivar)가 있습니다. 속성 의 이름입니다 . 속성은 점 표기법을 사용하여 읽거나 설정할 수있는 객체의 속성입니다 . 속성은하지 않습니다 이 바르 기반으로 할 수 있지만, 대부분의 속성이다. 선언은 단순히라는 속성이 있음을 세계에 알려줍니다 .example.h
example.m
mapView
myObject.mapView
@property
mapView
@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
'development' 카테고리의 다른 글
Java 배열은 처음에 요소를 추가하는 방법 (0) | 2020.06.14 |
---|---|
“장식 자”란 무엇이며 어떻게 사용됩니까? (0) | 2020.06.14 |
Gradle, Android 및 ANDROID_HOME SDK 위치 (0) | 2020.06.14 |
X는 Y를 구현하지 않습니다 (… 메소드에는 포인터 수신기가 있습니다) (0) | 2020.06.14 |
HttpPostedFile에서 바이트 배열을 만드는 방법 (0) | 2020.06.13 |