검색결과 리스트
MAC에 해당되는 글 3건
- 2011.03.20 Objective-C 훑어보기 (2)
- 2010.12.11 [Mac]launch daemon vs launch agent
- 2010.12.11 [Mac]시작프로그램/Script 등록하기
글
Objective-C 훑어보기
Objective-C 언어는 C 언어 기반위에 객체지향적인 요소를 가미한 언어로서, 객체지향 언어의 원류인 Smalltalk 에서
그 개념을 많이 차용했다고 한다. 이 포스팅에서는 언어의 구체적인 설명은 하지않고, 간략히 어떤 언어 요소들이
있는지만 알아보겠다.
1. Objective-C 에서 클래스 정의
#import "SuperClass.h"
@interface NewClass : SuperClass {
int instanceVariable;
}
- method;
- methodWithParameter:param;
@end
@implementation NewClass
- method {
return (nil);
}
- methodWithParameter:param {
return (nil);
}
2. Object Pointers
SpecificClass * specificObject; id anyObject;id 타입은 void * 형 포인터로 어떤 객체 포인터도 할당하거나 할당받을 수 있다.
3. Sending Messages
[object method]; [object methodWithParam:param];
objective-c에서는 메시지를 호출한다고 하기 보단, 객체에게 메세지를 보낸다고 한다.
3. Naming Method
다음과 같은 형식을 따른다.
- valuePrepositionParameter:parameter - objectForKey:key - stringByAppendingString:string; - numberFromString:string;
- (id)objectForKey:(id)aKey; - (NSMenuItem)itemWithTag:(NSInteger)aTag; - (unichar)characterAtIndex:(NSUInteger)index; - (NSString*)stringByAddingPercentEscapeUsingEncoding:(NSStringEncoding)encoding; - (void)runInNewThread; - (void)addAttribute:(NSString*)name value:(id)value range:(NSRange)aRange;
5. Method Selectors
SEL selector = @selector(fontWithFamily:traits:weight:size)
6. Instance Variable
isa 인스턴스 변수
Properties
라는 인스턴스 변수에 대해 @property int tag; @synthesize tag;를 선언되면 컴파일러는
- (int)tag
getter 와 setter를 기술하는 것은 프로그래머의 몫이다. 즉 @synthesize를 통해 자동생성하거나, 프로그래머가 직접 구현해줘야 한다. 그렇지 않으면 컴파일 에러가 발생할 것이다.
Property Attributes
| Attribute | Description |
| readonly | getter 만을 생성한다. readwrite 속성과 상반된다. |
| readwrite | 디폴트 값이며, getter 와 setter 를 모두 생성한다. |
| copy | setter 에서 인자를 인수변수에 저장할 때, 인자의 복사본을 저장한다. 객체 포인터 타입에만 유효한 속성이다. (primitive 타입은 항상 복사되기 때문) 리시버가 센더의 인자값을 변경하지 못하게 할 때 사용한다. |
| assign | 인스턴스 변수에 레퍼런스 카운팅 없이 단순 할당한다. 가비지 컬렉션이 존재하는 환경에서 참조를 유지하고 싶거나, 인자값이 변경불가능할 때 사용한다. |
| retain | assign과 유사하며, 가비지 컬렉션이 없는 Managed memory 환경에서 객체의 참조 카운터를 증가 시킨다. |
| getter=name | 지정한 name 이름으로 getter 를 생성한다. getter와 setter의 표준 패턴을 위반해서 Key-Value Coding 과 같은 기술들이 인식할 수 없게 될수도 있기 때문에 사용에 주의해야한다. |
| setter=name | 지정한 name 이름으로 setter 를 생성한다. |
| nonatomic | 디폴트로 생성된 setter 는 atomic 속성을 갖는다. 락을 사용하여 thread-safe 하지만, 상당한 오버헤드를 수반한다. 쓰레드의 개입이 없을 경우, 명시적으로 nonatomic 으로 선언하여 performance 를 높이는게 좋다. |
7. Class Methods
@interface RandomSequece : NSObject {
long long int seed;
}
+ (NSNumber*)number;
+ (NSNumber*)string;
- (NSNumber*)nextNumber;
- (NSString*)string;
@end
...
NSNumber *n = [RandomSequence number];
NSString *s = [RandomSequence string];
@interface Classy : NSObject {
+ (void)greeting;
+ (NSString*)salutation;
}
@end
@implementation
+ (void)greeting {
NSLog(@"%@, world!", [self salutation]);
}
+ (NSString*)salutation {
NSLog(@"Greetings");
}
@end
@interface Classic : Classy
+ (NSString*)salutation;
@end
+ (NSString*)salutation {
return (@"Hello");
}
@end
...
[Classy greeting]; // Logs "Greetings, world"
[Classic greeting]; // Logs "Hello, world!"
[Classic greeting] 은 Classy Class 객체에 메시지를 보내고, [self salutation]은 해당 Cass 클래스 객체에 메시지를 보낸다.
Class 객체에 메시지를 보낸다.
8. Constructing Objects
생성하는 방법을 클래스 설계자가 결정하도록 한다.
@interface RandomSequence : NSObject {
long long seed;
}
- (id)init;
- (id)initWithSeed:(long long)startingSeed;
@end
@implementation RandomSequence
- (id)init {
self = [super init];
if (self != nil) {
seed = 1;
}
return (self);
}
- (id)initWithSeed:(long long)startingSeed {
self = [super init];
if (self != nil) {
seed = startingSeed;
}
return (self);
}
@end
...
RandomSequence *r1 = [[RandomSequence alloc] init];
RandomSequence *r2 = [[RandomSequence alloc] initWithSeed:-43 ];
RandomSequence * r3 = [RandomSequence new];
그것을 isa 변수에 할당한다. 그리고 인스턴스를 모두 0으로 채운뒤, 참조를 반환한다. 이 시점에서 요청된 객체가 존재하지만
아직 초기화는 되지않았다. init 메시는 객체를 초기화를 담당하며, 이메시지가 반환되면 깨체는 사용할 준비가 된 상태가 된다.
9. Writing an init Method
책임이 있다. self 를 변경하는 것은 자바 프로그래머에게는 이상하지만, Class Cluster를 위해 핵심이 되는 부분이다.
때문에 방어적인 프로그램을 위한 것이다. 모든 잘 작성된 생성자는 위의 4가지 조건을 만족해야 한다
- (void)finalize {
if (file != nil) {
[file close];
file = nil;
}
[super finalize]
}
Inner / Anonymous Classes (내부 클래스와 익명클래스)
'Objective-C' 카테고리의 다른 글
| Objective-C 문자열 조작 메서드 (0) | 2011.04.29 |
|---|---|
| 다중인자를 갖는 PerformSelector 메시지 (0) | 2011.03.23 |
| Protocol 과 Category (0) | 2011.03.22 |
| Objective-C 훑어보기 (2) | 2011.03.20 |
| [Cocoa] Cocoa Design Pattern (0) | 2011.03.20 |
| HMAC-SHA1 구현 (0) | 2011.03.03 |
설정
트랙백
댓글
글
[Mac]launch daemon vs launch agent
'운영체제로그 > MacOS' 카테고리의 다른 글
| [Mac]launch daemon vs launch agent (0) | 2010.12.11 |
|---|---|
| [Mac]시작프로그램/Script 등록하기 (0) | 2010.12.11 |
설정
트랙백
댓글
글
[Mac]시작프로그램/Script 등록하기
Mac에서 시작 프로그램를 다음과 같이 등록할 수 있다.
시스템 환경설정(System Preferences) > 계정설정(Account) > "로그인 항목" 에
부팅완료 후 자동실행을 할 애플리케이션을 추가하거나 삭제할 수 있다.
MySQL을 설치하고, MySQL 서버를 시작과 동시에 구동하려 했는데... 위 항목에서는
스크립트를 추가할 수가 없었다.
launchd를 사용하여 데몬으로 시작시키는 방법을 알아보았다~
1 PropertyEditor 를 실행시켜서 아래와 같이 입력한다.
2. com.mysql.mysqld.plist 라는 이름으로 저장한다.
3. 이 파일을 /Library/LaunchDaemons 폴더로 복사한다.
4. 파일의 소유자와 그룹, 권한을 다음과 같이 변경한다.
$cd /Library/LauchDaemons$sudo chown root com.mysql.mysqld$sudo chgrp wheel com.mysql.mysqld$sudo chmod 644 com.mysql.mysqld
5. sudo launchctl load com.mysql.mysqld.plist 명령을 수행하여, launchd 에 작업을 등록한다.
* plist 파일에 지정합 키-값은 launchd 에 의해 미리 정해진 옵션으로 Program을 daemon으로 수행하기 위한 옵션으로 작용한다.
plist 파일을 변경하고, 다시 적용하기 위해서는 먼저 launchctl unload com.mysql.mysqld.plist 명령으로 언로드를 수행하고 다시 적용시켜야한다
디폴트로 mysqld 는 /etc/my.cnf 파일에 정해진 설정을 읽어서 구동되는데, 이 파일에 옵션을 줄 수도 있지만, plist 파일을 사용하면
모든 설정을 한곳으로 모을수 있는 장점이 있다. mysqld 에 줄수 있는 옵션들은 /etc/my.cnf 파일을 열어 확인을 하고,
plist 파일의 ProgramArguments 키의 array 값의 인자로 지정을 하면된다.
plist 파일의 추가할 수 있는 키옵션들은 man launchd.plist 명령을 통해 확인하자.
'운영체제로그 > MacOS' 카테고리의 다른 글
| [Mac]launch daemon vs launch agent (0) | 2010.12.11 |
|---|---|
| [Mac]시작프로그램/Script 등록하기 (0) | 2010.12.11 |