'Dev'에 해당되는 글 58건

  1. 2011.09.25 fgets 에서 프로그램이 진행 안됄때.
  2. 2011.09.23 NSMutableArray 인스턴스에 접근시 EXC_BAD_ACCESS 발생.
  3. 2011.09.23 iOS Coverflow Control
  4. 2011.09.22 SQLite3를 이용해 실제 Device에서 실행시 오류.
  5. 2011.09.22 iOS에서 SQLite3에 이미지 저장하는 방법 : 링크
  6. 2011.09.20 SQLite3 tutorial
  7. 2011.07.11 iOS 개발자 등록
  8. 2011.06.13 Library 에 따른 Link code.

fgets 에서 프로그램이 진행 안됄때.

Dev 2011. 9. 25. 20:03


어처구니 없는 실수...
Linux에 간단한 게임 서버를 공부삼아 꾸며 봐야겠다는 생각에 일단 테스트로 에코 서버/클라이언트를 작성해 보았는데 이상하게 프로그램이 프리징 된듯하게 진행이 안돼는 것이였다.
분명 대학교때 사용하던 책이었고 작성해 봤었던 간단한 프로그램이였는데 왜 안돼는지 정말 답답 했었다.
리눅스여서 뭔가 다른가? 하고 눈을 씻고 여기저기 구석구석 찾아 보았다.

원인은....

문자열을 입력 받기 위한 fgets 함수에 있었다.

fgets(message, BUFSIZE, stdin);

이것을

fgets(message, strlen(message), stdin);

이렇게 잠결에 아랫줄과 혼돈하여 넣은것이다.
잠결에 코드 작성하지 말자.

그런데, 프로그램이 아예 뻑나거나... 그러질 않고 가만히 멈추어 있는 뭐지? ㅋㅋ
리눅스(gcc 라고 해야하나?)상에서 디버깅 기술이 전혀 없어서 그런듯 하다.
시간 날때 꼭 디버깅에 대해 정리해보고 공부해야겠다.

해당 함수의 레퍼런스 링크 : http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
:

NSMutableArray 인스턴스에 접근시 EXC_BAD_ACCESS 발생.

Dev/iOS 2011. 9. 23. 17:53


Model 클래스에서 데이터 베이스의 내용을 읽어 NSMutableArray 로컬 변수에 채운후 클래스 멤버 변수로 대입 후 다른 뷰 콘트롤러에서 해당 배열에 접근을 시도 하였더니 EXC_BAD_ACCESS 에러가 발생 되었다.
원인은 데이터 베이스에서 읽어온 데이터를 저장 중이던 배열을 release해준것으로 보인다.

@interface Model : NSObject {
  NSMutableArray _array;
}
@property (retain) NSMutableArray * _array;
@end 

@implemention Model

...

- (void)readDatabase {
  ...
  NSMutableArray localArray = [[NSMutableArray alloc] initWithCapacity:sqlite3_data_count(statement)];

  // database에서 읽어온 데이터를 localArray에 채워 넣는다.

  _array = localArray;
  [localArray release]; 

}

위와 같이 release 코드를 삭제 해주면 해달 오류는 발생하지 않는데 아직 정확한 원인을 이해하지 못하겠다.
아직 Object-C 에서 메모리 관리가 정확히 어떻게 되는지 감이 안온다.
메모리 관리에 관련된 부분을 좀 더 자세히 공부해봐야겠다.

뭔진 모르지만 C언어의 그것과 굉장히 헷갈리고 매치가 되질 않는데 뭘가를 잘못 생각하고 있는듯 하다.

위와 같은 원인에 대하여 아시는 분 있으시면 좀 알려주세요 !!
 
:

iOS Coverflow Control

Dev/iOS 2011. 9. 23. 14:55


프로젝트에 iTunes에서 음악을 재생하면 나타나는 앨범 재킷들처럼 Coverflow 를 삽입하는 내용을 정리한다.
원문 : iPhone Coverflow Tutorial : Adding Tapku To Xcode4 Project 



 Devin Ross란 사람이 만든 Tapku 라는 라이브러리를 사용한다. (Free library)
download
 
1. View-based application iphone 프로젝트를 생성한다.
2. Tapku library 를 프로젝트로 복사한다. 
3. 복사후 해당 폴더 안으 TapkuLibrary.xcodeproj 파일을 프로젝트의 framework group에 드래그 앤 드롭한다.
4. 'TapkuLibrary' 폴더 아래의 'TabkuLibrary.bundle' 파일을 프로젝트의 Supporting Files group에 드래그 앤 드롭한다. 대화 상자가 나타나면 "Create Folder References"를 선택 하고 "Copy items"는 체크를 해제 한후 'Finish'를 클릭한다.
5. Core Animation & MapKit frameworks를 프로젝트에 추가한다.
 - Project navigator에서 project file을 선택
 - targets list 에서 해당 target을 선택
 - Build Phases tab을 선택 후 Link Binary With Libraries 를 확장한다.
 - '+'버튼을 클릭해서 'QuartzCore.framework'와 'MapKit.framework'을 추가한다.
6. Target Dependencies에 Tapku library 추가
 - 'Target Dependencies'를 확장
 - Tapku Xcode project에서 TapkuLibrary를 추가
7. libTapkuLibrary.a추가
 - Target Build Phases 의 'Link Binary With Libraries'섹션에서 '+'버튼을 클릭해 'libTapkuLibrary.a'를 추가한다.
8. Build Settings의 'Header Search Paths'에 '$(SRCROOT)/Coverflow/Tapku/src'를 추가해 준후 Done. (자신의 프로젝트에 알맞도록 변경 할것)
9. Linker 섹션 아래 'Other Linker Flags'에 '-ObjC'와 'all_load' flag추가 후 Done.
10. Tapku 폴더의 src/Frameworks/ 위치에 있는 TouchJSON library를 추가한다.
 - TouchJSON폴더를 frameworks group에 드래그 앤 드롭 한다.
 - 대화상자가 나타나면 copy item checkbox 를 선택한다.

설정 완료.

뷰 컨트롤러의 헤더. ----

#import <UIKit/UIKit.h>
#import <TapkuLibrary/TabkuLibrary.h>

@interface XXXViewController : UIViewController <TKCoverflowViewDelegate, TKCoverflowViewDataSource>
{
    TKCoverflowView * coverflow;
    NSMutableArray * covers;
}
@property (retain, nonatomic) TKCoverflowView * coverflow;

@end

뷰 컨트롤러의 구현 파일. -----
- (void)viewDidLoad
{
    [super viewDidLoad];

    covers = [[NSArray arrayWithObjects:
        [UIImage imageNamed:@"aaaa.png"], [UIImage imageNamed:@"bbbb.png"], nil] retain];

    coverflow = [[TKCoverflowView alloc]  initWithFrame:CGRectMake(0, 0, 480, 300)];
    coverflow.coverflowDelegate = self;
    coverflow.dataSource = self;
    [self.view addSubview:coverflow];
    [coverflow setNumberOfCovers:50];
}
 
** 추가로 datasource 와 view delegate 메소드들을 구현해줘야 한다. 데모는 landscape로 회전되어 있는다.
project download
 
이상. 프로그램 소스는 코드에서 복사한 내용이 아니라 오탈자가 있을수 있으니, 소스 코드를 다운로드 하여 확인.
:

SQLite3를 이용해 실제 Device에서 실행시 오류.

Dev/iOS 2011. 9. 22. 17:33


error 내용 )
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1

SQLite3 라이브러리를 사용하는 코드를 작성중. 시뮬레이터에서는 정상 작동하는 코드가 실제 디바이스 타겟으로 잡아 놓고 실행시 위와 같은 오류 메시지를 뱉어내며 빌드가 실패한다.

문제점 )
프로젝트의 Build Settings 의 Library Search Paths 가 기본으로 시뮬레이터의 경로로 설정되어 있는 경우에 발생 되는듯 하다.

해당 위치 : 프로젝트 루트 선택 -> TARGETS중 해당 타겟 선택



해결책 )
해당 위치를 iPhoneOS.platform에 해당하는 위치로 변경해 주면 빌드가 정상적으로 된다.


iPhoneOS platform 에 해당하는 위치를 입력후 iPhoneSimulator platform의 위치보다 위로 드래그앤 드롭하여 올려준다. 자세한 위치는 다음과 같이 변경 하였다 (version 4.3 일경우)

LIBRARY_SEARCH_PATHS = $(inherited) "$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib"




해당 내용은 SQLite3라이브러리만 해당하는것이 아니라 다른 종류의 라이브러리들도 해당되리라 생각 된다.

:

iOS에서 SQLite3에 이미지 저장하는 방법 : 링크

Dev/iOS 2011. 9. 22. 13:18


미니 님의 페이지 링크.
 
:

SQLite3 tutorial

Dev/database 2011. 9. 20. 16:52


iOS에서 사용할 SQLite3 의 사용법에 대해 정리한다.
원문 링크 : http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html
내가 작성하며 테스트한 환경 : SQLite version 3.7.7.1 2011-06-28 17:39:05

OSX에서 확인하는 경우 Xcode를 설치를 하면 기본으로 설치가 되는 것으로 알고 있다.

Common Commands

database 생성
Terminal 창을 열어 다음과 같이 입력하면 test.db라는 이름의 데이터 베이스가 생성된다.

$ sqlite3 test.db 
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .quit
$

종료를 하기 위한 명령어는 .q .quit .exit 중에 하나를 입력하면 명령 프롬프트로 돌아간다.

table 생성
다음과 같이 테이블(t1)을 생성한다.
$ sqlite3 test.db "create table t1 (t1key INTEGER PRIVAMY KEY,data TEXT, num double, timeEnter DATE);"

생성된 테이블에 데이터 삽입
insert 질의문을 이용하여 테이블에 데이터를 삽입한다.

$ sqlite3 test.db  "insert into t1 (data,num) values ('This is sample data',3);"
$ sqlite3 test.db  "insert into t1 (data,num) values ('More sample data',6);"

$ sqlite3 test.db  "insert into t1 (data,num) values ('And a little more',9);"

삽인된 후의 테이블 데이터 전체 내용 확인
select 질의문을 이용하여 테이블의 내용을 확인한다. 튜토리얼의 내용에는 기본키로 설정한 t1key가 자동 증가가 된다고 되어 있는데 내 맥에서는 자동 증가가 되질 않는지 표시가 되질 않았다. autoincrement 명령어를 주어야 하나보다.

$ sqlite3 test.db "select * from t1;"
|This is sample data|3.0|
|More sample data|6.0||And a little more|9.0|
 
지정된 개수의 행만 출력
limit 명령(?)으로 제한을 줄 수 있다. 2개의 행만을 출력.
 
$ sqlite3 test.db "select * from t1 limit 2;" 
|This is sample data|3.0|
|More sample data|6.0|

Offset 주기
offset 명령(?)으로 오프셋을 줄 수 있다. 다음과 같이 하면 t1key를 기준하여 2개를 오프셋을 준 상태에서 하나의 행만을 출력한다.
$ sqlite3 test.db "select * from t1 order by t1key limit 1 offset 2;"
|And a little more|9.0|

table 이름 보기
.table 명령어를 이용하여 테이블의 이름을 볼 수 있다.
$ sqlite3 test.db ".table"
t1

테이블 리스트의 더 자세한 내용 보기
sqlite_master 을 이용하여 표시할 수 있다.

$ sqlite3 test.db "select * from sqlite_master;"

table|t1|t1|2|CREATE TABLE t1 (t1key INTEGER PRIVAMY KEY,data TEXT, NUM double, timeEnter DATE)

database로 실행된 모든 SQL 정보를 확인.

$ sqlite3 test.db ".dump"

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE t1 (t1key INTEGER PRIVAMY KEY,data TEXT, NUM double, timeEnter DATE);
INSERT INTO "t1" VALUES(NULL,'this is sample data',3.0,NULL);
INSERT INTO "t1" VALUES(NULL,'More sample data',6.0,NULL);
INSERT INTO "t1" VALUES(NULL,'And a little more',9.0,NULL);
COMMIT;


==============================================================
내가 확인한 내용을 여기 까지 이며, 추 후 필요한 내용들은 확인 후 추가 할 것이다. 좀더 구체적이고 자세한 내용을 원하면 내용 첫부분의 원문으로 링크를 쫒아가면된다.
그리고, 원문과 내용이 약간 다를 수 있으므로 의문이 생기거나 이상한 부분도 원문을 확인 하시길... 

:

iOS 개발자 등록

Dev/iOS 2011. 7. 11. 12:35


iOS 에서 개발을 위해 개발자 라이센스를 구입했다.
뭐, 요즘은 애플 개발자 홈페이지에도 자세하게 나와있고, 인터넷 검색만 이용해도 굉장히 많이 나오니 등록은 쉬웠다.
인증 메일이 스펨으로 들어가 iOS 전담 서비스 센터(080-860-9797)에 전화한통 한것 이외에는 아무 어려움 없이 끝났다.

그리고 메일도 전화도, 모두 한국어로 진행 되니 어려울 것 없다.
 
:

Library 에 따른 Link code.

Dev/C, C++ 2011. 6. 13. 10:50


#if defined(_DEBUG)
#if defined(_UNICODE)
#define _LIB_PROJECT_CONFIGURATION "UD"
#else
#define _LIB_PROJECT_CONFIGURATION "D"
#endif // _UNICODE
#else
#if defined(_UNICODE)
#define _LIB_PROJECT_CONFIGURATION "U"
#else
#define _LIB_PROJECT_CONFIGURATION ""
#endif // _UNICODE
#endif // _DEBUG

#pragma comment(lib, "libraryname" _LIB_PROJECT_CONFIGURATION ".lib")
#pragma message("Automatically linking with libraryname" _LIB_PROJECT_CONFIGURATION ".dll")

: