@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.m
mapView
는 속성 이름입니다.속성은 점 표기법을 사용하여 읽거나 설정할 수 있는 개체의 속성입니다.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];
}
}
하면, 「」를 할 수 .@synthesize
with 붙은 스테이트먼트.
@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
와 같은 변수에 액세스 합니다.someInt
ivar에 선행 언더스코어를 사용하지 않는 것은 명명규칙에 준거하지 않습니다만, 그러한 코드를 읽고 수정하지 않으면 안 되는 상황이 되었습니다.
그러나 "새로운 컴파일러를 사용하기 때문에 @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는 속성으로 백업된 인스턴스 변수의 이름을 변경하는 데 사용됩니다.
기본적으로 합성에서는 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
'programing' 카테고리의 다른 글
shell에서 source 명령을 찾을 수 없습니다. (0) | 2023.04.17 |
---|---|
R 스크립트에서 Excel 파일 직접 읽기 (0) | 2023.04.12 |
다중 INSERT 문 대 다중 값을 가진 단일 INSERT (0) | 2023.04.12 |
VBA 코드로 IP 주소를 ping하고 결과를 Excel로 반환 (0) | 2023.04.12 |
iPhone 앱크래시 보고서 상징화 (0) | 2023.04.12 |