이것은 Objective-C에서 선언 된 모든 종류의 변수의 예입니다. 변수 이름은 액세스를 나타냅니다.
파일 : Animal.h
@interface Animal : NSObject
{
NSObject *iProtected;
@package
NSObject *iPackage;
@private
NSObject *iPrivate;
@protected
NSObject *iProtected2; // default access. Only visible to subclasses.
@public
NSObject *iPublic;
}
@property (nonatomic,strong) NSObject *iPublic2;
@end
파일 : Animal.m
#import "Animal.h"
// Same behaviour for categories (x) than for class extensions ().
@interface Animal(){
@public
NSString *iNotVisible;
}
@property (nonatomic,strong) NSObject *iNotVisible2;
@end
@implementation Animal {
@public
NSString *iNotVisible3;
}
-(id) init {
self = [super init];
if (self){
iProtected = @"iProtected";
iPackage = @"iPackage";
iPrivate = @"iPrivate";
iProtected2 = @"iProtected2";
iPublic = @"iPublic";
_iPublic2 = @"iPublic2";
iNotVisible = @"iNotVisible";
_iNotVisible2 = @"iNotVisible2";
iNotVisible3 = @"iNotVisible3";
}
return self;
}
@end
iNotVisible 변수는 다른 클래스에서 볼 수 없습니다. 이것은 가시성 문제이므로 선언 @property
하거나 @public
변경하지 않습니다.
생성자 내에서 부작용을 피하기 위해 @property
대신 밑줄 을 사용하여 선언 된 변수에 액세스하는 것이 좋습니다 self
.
변수에 액세스 해 보겠습니다.
파일 : Cow.h
#import "Animal.h"
@interface Cow : Animal
@end
파일 : Cow.m
#import "Cow.h"
#include <objc/runtime.h>
@implementation Cow
-(id)init {
self=[super init];
if (self){
iProtected = @"iProtected";
iPackage = @"iPackage";
//iPrivate = @"iPrivate"; // compiler error: variable is private
iProtected2 = @"iProtected2";
iPublic = @"iPublic";
self.iPublic2 = @"iPublic2"; // using self because the backing ivar is private
//iNotVisible = @"iNotVisible"; // compiler error: undeclared identifier
//_iNotVisible2 = @"iNotVisible2"; // compiler error: undeclared identifier
//iNotVisible3 = @"iNotVisible3"; // compiler error: undeclared identifier
}
return self;
}
@end
런타임을 사용하여 보이지 않는 변수에 계속 액세스 할 수 있습니다.
파일 : Cow.m (2 부)
@implementation Cow(blindAcess)
- (void) setIvar:(NSString*)name value:(id)value {
Ivar ivar = class_getInstanceVariable([self class], [name UTF8String]);
object_setIvar(self, ivar, value);
}
- (id) getIvar:(NSString*)name {
Ivar ivar = class_getInstanceVariable([self class], [name UTF8String]);
id thing = object_getIvar(self, ivar);
return thing;
}
-(void) blindAccess {
[self setIvar:@"iNotVisible" value:@"iMadeVisible"];
[self setIvar:@"_iNotVisible2" value:@"iMadeVisible2"];
[self setIvar:@"iNotVisible3" value:@"iMadeVisible3"];
NSLog(@"\n%@ \n%@ \n%@",
[self getIvar:@"iNotVisible"],
[self getIvar:@"_iNotVisible2"],
[self getIvar:@"iNotVisible3"]);
}
@end
보이지 않는 변수에 접근 해 봅시다.
파일 : main.m
#import "Cow.h"
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
Cow *cow = [Cow new];
[cow performSelector:@selector(blindAccess)];
}
}
이것은 인쇄
iMadeVisible
iMadeVisible2
iMadeVisible3
_iNotVisible2
하위 클래스 전용 인 백업 ivar에 액세스 할 수있었습니다 . Objective-C에서는 모든 변수를 읽거나 설정할 수 있으며,으로 표시된 변수 @private
도 예외없이 읽을 수 있습니다 .
나는 서로 다른 새이기 때문에 관련 객체 또는 C 변수를 포함하지 않았습니다. C 변수의 경우 외부에서 정의 된 모든 변수 @interface X{}
또는 @implementation X{}
파일 범위 및 정적 저장소가있는 C 변수입니다.
메모리 관리 속성, 읽기 전용 / 읽기 쓰기, getter / setter 속성에 대해서는 논의하지 않았습니다.