문제

나는 ~에 대해 알고 있다 높음 (매우 편리합니다!) 그러나 Objective-C를 작성할 때, 특히 Cocoa(또는 CocoaTouch)를 사용할 때 어떤 프로그래밍 방식을 사용합니까?

도움이 되었습니까?

해결책

내가 표준이라고 생각하지 않는 몇 가지 일이 있습니다.

1) 속성의 출현으로 더 이상 "_"를 사용하여 "개인"클래스 변수를 접두사에 사용하지 않습니다. 결국, 다른 클래스에서 변수에 액세스 할 수 있다면 그 속성이 없어야합니까? 나는 항상 코드를 추악하게 만들기 위해 "_"접두사를 싫어했고, 이제 나는 그것을 떠날 수 있습니다.

2) 사적인 것들에 대해 말하면.

#import "MyClass.h"

@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end

@implementation MyClass

외부인이 신경 쓰지 말아야 할 사물로 .H 파일을 혼란스럽게하는 이유는 무엇입니까? 빈 ()은 .m 파일의 개인 카테고리에 대해 작동하며, 선언 된 메소드를 구현하지 않으면 경고를 컴파일합니다.

3) @synthesize 지시문 바로 아래에있는 .m 파일의 상단에 Dealloc을 넣었습니다. 당신이 거래하는 것이 수업에서 생각하고 싶은 것들의 목록의 최상위에 있지 않아야합니까? 그것은 iPhone과 같은 환경에서 특히 그렇습니다.

3.5) 표 셀에서 성능을 위해 모든 요소 (세포 자체 포함)를 불투명하게 만듭니다. 즉, 모든 것에 적절한 배경색을 설정하는 것을 의미합니다.

3.6) NSURLConnection을 사용할 때는 원칙적으로 대의원 방법을 구현할 수 있습니다.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
      return nil;
}

나는 대부분의 웹 통화가 매우 단수이며, 특히 웹 서비스 호출을 위해 응답을 원하는 규칙보다 예외입니다. 표시된대로 방법을 구현하면 응답의 캐싱이 비활성화됩니다.

또한 관심있는 것은 Joseph Mattiello (iPhone 메일 링리스트에서받은)의 좋은 iPhone 특정 팁입니다. 더 많은 것이 있지만, 이것들은 내가 생각한 가장 일반적으로 유용했습니다 (응답에 제공되는 세부 사항을 포함하도록 몇 비트가 원본에서 약간 편집되었습니다).

4) Corelocation을 사용하는 것과 같이 필요한 경우 이중 정밀도 만 사용하십시오. GCC가 플로트로 저장하도록 상수를 'f'로 끝내십시오.

float val = someFloat * 2.2f;

이것은 대부분 중요합니다 someFloat 실제로 두 배가 될 수 있습니다. 스토리지에서 'val'에서 정밀도를 잃고 있기 때문에 혼합 모드 수학이 필요하지 않습니다. 플로팅 포인트 숫자는 iPhone의 하드웨어에서 지원되지만 단일 정밀도와 달리 이중 프리렉션 산술을 수행하는 데 여전히 더 많은 시간이 걸릴 수 있습니다. 참조 :

구형 전화에서 계산은 같은 속도로 작동하지만 레지스터에 더 많은 정밀 구성 요소가 더 두 배가 될 수 있으므로 많은 계산의 경우 단일 정밀도가 더 빨라집니다.

5) 속성을 다음과 같이 설정하십시오 nonatomic. 그것들입니다 atomic 기본적으로 합성시, 세마포 코드는 다중 스레딩 문제를 방지하기 위해 만들어집니다. 99%는 아마도 이것에 대해 걱정할 필요가 없으며 비 원자로 설정할 때 코드가 훨씬 덜 부풀어 오르고 메모리 효율적입니다.

6) SQLITE는 큰 데이터 세트를 캐시하는 매우 빠른 방법 일 수 있습니다. 예를 들어 맵 응용 프로그램은 타일을 SQLITE 파일로 캐시 할 수 있습니다. 가장 비싼 부분은 디스크 I/O입니다. 보내는 많은 작은 글을 피하십시오 BEGIN; 그리고 COMMIT; 큰 블록 사이. 우리는 예를 들어 각 새 제출에 재설정되는 2 초 타이머를 사용합니다. 만료되면 우리는 커밋을 보냅니다. , 이로 인해 모든 쓰기가 하나의 큰 덩어리로 이동합니다. SQLITE는 트랜잭션 데이터를 디스크에 저장 하고이 시작/끝 랩핑을 수행하면 많은 트랜잭션 파일의 생성을 피하고 모든 트랜잭션을 하나의 파일로 그룹화합니다.

또한 SQL은 기본 스레드에있는 경우 GUI를 차단합니다. 쿼리가 매우 긴 경우 쿼리를 정적 객체로 저장하고 별도의 스레드에서 SQL을 실행하는 것이 좋습니다. 쿼리 문자열의 데이터베이스를 수정하는 모든 것을 랩핑하십시오. @synchronize() {} 블록. 짧은 쿼리의 경우 편의를 위해 메인 스레드에 물건을 남겨 두십시오.

더 많은 SQLITE 최적화 팁이 여기에 있지만, 문서가 현재 외에 나타납니다. 많은 포인트가 여전히 좋을 것입니다.

http://web.utk.edu/~jplyon/sqlite/sqlite_optimization_faq.html

다른 팁

알 수없는 문자열을 형식 문자열로 사용하지 마십시오

메소드 또는 함수가 형식 문자열 인수를 취하면 형식 문자열의 내용을 제어해야합니다.

예를 들어, 문자열을 로깅 할 때 문자열 변수를 유일한 인수로 전달하려고합니다. NSLog:

    NSString *aString = // get a string from somewhere;
    NSLog(aString);

이것의 문제는 문자열에 형식 문자열로 해석되는 문자가 포함될 수 있다는 것입니다. 이로 인해 출력, 충돌 및 보안 문제가 잘못 될 수 있습니다. 대신 문자열 변수를 형식 문자열로 대체해야합니다.

    NSLog(@"%@", aString);

다른 환경에서 사용 된 것보다 표준 코코아 이름 지정 및 서식 규칙 및 용어를 사용하십시오. 거기 ~이다 많은 코코아 개발자가 있으며, 그중 하나가 코드를 작업하기 시작하면 다른 코코아 코드와 비슷해 보이고 느껴지면 훨씬 더 접근하기 쉽습니다.

해야 할 일과하지 말아야 할 일의 예 :

  • 선언하지 마십시오 id m_something; 객체의 인터페이스에서 a라고 부릅니다 회원 변수 또는 필드; 사용 something 또는 _something 그 이름으로 그것을 부릅니다 인스턴스 변수.
  • getter의 이름을 말하지 마십시오 -getSomething; 적절한 코코아 이름은 단지입니다 -something.
  • 세터의 이름을 지정하지 마십시오 -something:; 그것은해야한다 -setSomething:
  • 메소드 이름은 인수와 산재되어 있으며 콜론을 포함합니다. 이것의 -[NSObject performSelector:withObject:], 아니다 NSObject::performSelector.
  • 메소드 이름, 매개 변수, 변수, 클래스 이름 등에 언더 바가 아닌 캡 (Camelcase)을 사용하십시오.
  • 클래스 이름은 상류 문자, 변수 및 메소드 이름으로 시작합니다.

당신이 무엇을하는지, ~하지 않다 Win16/Win32 스타일 헝가리 표기법을 사용하십시오. Microsoft조차도 .NET 플랫폼으로의 이동으로 포기했습니다.

Iboutlets

역사적으로 아울렛의 메모리 관리는 열악했습니다. 현재 모범 사례는 매장을 속성으로 선언하는 것입니다.

@interface MyClass :NSObject {
    NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end

속성을 사용하면 메모리 관리 시맨틱이 명확 해집니다. 또한 인스턴스 변수 합성을 사용하는 경우 일관된 패턴을 제공합니다.

LLVM/Clang 정적 분석기를 사용하십시오

참고 : Xcode 4 아래에 이것은 이제 IDE에 내장되어 있습니다.

당신은 사용합니다 Clang 정적 분석기 의심 할 여지없이-Mac OS X 10.5에서 C 및 Objective-C 코드 (C ++ 없음)를 분석하십시오. 설치하고 사용하는 것은 사소한 일입니다.

  1. 최신 버전을 다운로드하십시오 이 페이지.
  2. 명령 줄에서 cd 프로젝트 디렉토리에.
  3. 실행하다 scan-build -k -V xcodebuild.

(몇 가지 추가 제약 조건이 있습니다. 특히 "디버그"구성에서 프로젝트를 분석해야합니다. http://clang.llvm.org/staticanalysisuage.html 자세한 내용은-그러나 그것은 그것이 무엇으로 귀를 기울이는 지 더 가깝습니다.)

그런 다음 분석기는 메모리 관리 및 컴파일러가 감지 할 수없는 기타 기본 문제를 보여주는 일련의 웹 페이지를 생성합니다.

이것은 미묘하지만 편리한 것입니다. 다른 객체로 대의원으로 자신을 전달하는 경우 해당 객체의 대의원을 재설정하십시오. dealloc.

- (void)dealloc
{
self.someObject.delegate = NULL;
self.someObject = NULL;
//
[super dealloc];
}

이렇게하면 더 이상 대표 방법이 전송되지 않도록합니다. 당신이하려고합니다 dealloc 그리고 우연히 더 이상 메시지를 보낼 수 없는지 확인하고 싶은 에테르로 사라집니다. self.someobject는 다른 물체 (싱글 톤 또는 자동 제출 풀 등에있을 수 있음)에 의해 유지 될 수 있으며 "메시지 보내기를 중지하십시오!"라고 말할 때까지, 그것은 당신의 정당한 대상이되는 물건을 생각한다고 생각합니다. 공정한 게임입니다.

이 습관에 들어가면 디버그하기 어려운 이상한 충돌로부터 당신을 구할 수 있습니다.

동일한 원칙은 주요 가치 관찰 및 nsnotification에도 적용됩니다.

편집하다:

훨씬 더 방어적이고 변화 :

self.someObject.delegate = NULL;

안으로:

if (self.someObject.delegate == self)
    self.someObject.delegate = NULL;

@kendell

대신에:

@interface MyClass (private)
- (void) someMethod
- (void) someOtherMethod
@end

사용:

@interface MyClass ()
- (void) someMethod
- (void) someOtherMethod
@end

객관적인 C 2.0의 새로운.

클래스 확장은 Apple의 Objective-C 2.0 참조에 설명되어 있습니다.

"클래스 확장자는 기본 클래스 @interface 블록 이외의 위치에서 클래스에 필요한 추가 API를 선언 할 수 있습니다."

따라서 그들은 실제 클래스의 일부이며 클래스 외에 (개인) 카테고리가 아닙니다. 미묘하지만 중요한 차이.

자동 제출을 피하십시오

일반적으로 (1) 수명을 직접 제어 할 수 없으므로 AutorELed 객체는 비교적 오랫동안 지속될 수 있으며 응용 프로그램의 메모리 풋 프린트를 불필요하게 증가시킬 수 있습니다. 데스크탑에서 이것은 거의 결과가 없을 수 있지만, 더 제한된 플랫폼에서는 이것이 중요한 문제가 될 수 있습니다. 따라서 모든 플랫폼, 특히보다 제한된 플랫폼에서 자동 퇴행 객체로 이어지는 메소드를 사용하지 않고 대신 Alloc/Init 패턴을 사용하도록 권장됩니다.

따라서 : 대신 :

aVariable = [AClass convenienceMethod];

가능하면 대신 사용해야합니다.

aVariable = [[AClass alloc] init];
// do things with aVariable
[aVariable release];

새로 만들어진 물체를 반환하는 자신의 방법을 작성할 때 코코아의 이름 지정 컨벤션 수신기에 플래그를 표시하려면 "새"로 메소드 이름을 선물하여 해제해야합니다.

따라서 : 대신 :

- (MyClass *)convenienceMethod {
    MyClass *instance = [[[self alloc] init] autorelease];
    // configure instance
    return instance;
}

당신은 쓸 수 있습니다 :

- (MyClass *)newInstance {
    MyClass *instance = [[self alloc] init];
    // configure instance
    return instance;
}

메소드 이름은 "새"로 시작되므로 API의 소비자는 그들이 수신 된 객체를 공개 할 책임이 있음을 알고 있습니다 (예 : 참조하십시오. nsobjectController 's newObject 방법).

(1) 자신의 로컬 자동 제출 풀을 사용하여 통제 할 수 있습니다. 이에 대한 자세한 내용은 참조하십시오 자동 제출 풀.

이 중 일부는 이미 언급되었지만 여기 내 머리 꼭대기에서 생각할 수있는 것이 있습니다.

  • KVO 명명 규칙을 따르십시오. 지금 KVO를 사용하지 않더라도 내 경험상 종종 앞으로도 여전히 유익합니다. 그리고 KVO 또는 바인딩을 사용하는 경우 상황이 예상대로 작동한다는 것을 알아야합니다. 여기에는 액세서 방법 및 인스턴스 변수뿐만 아니라 현상 관계, 검증, 자동 알림 종속 키 등이 다룹니다.
  • 개인 방법을 카테고리에 넣습니다. 인터페이스뿐만 아니라 구현도 마찬가지입니다. 민간 및 비 개인적인 방법 사이에 개념적으로 거리를 갖는 것이 좋습니다. .M 파일에 모든 것을 포함시킵니다.
  • 배경 스레드 메소드를 범주에 넣습니다. 같은 상기와. 메인 스레드의 내용과 그렇지 않은 것에 대해 생각할 때 명확한 개념적 장벽을 유지하는 것이 좋습니다.
  • 사용 #pragma mark [section]. 일반적으로 나는 내 자신의 방법, 각 서브 클래스의 재정의 및 정보 또는 공식 프로토콜로 그룹화합니다. 이것은 내가 찾고있는 것을 정확히 쉽게 점프하기가 훨씬 쉽게 만듭니다. 동일한 주제에서, 유사한 방법 (테이블 뷰의 대의원 방법과 같은)을 함께 그룹화하지는 않지만 아무데도 고수하지 마십시오.
  • 프리 개인 메소드 및 _. 나는 그것이 보이는 방식을 좋아하고, 우연히 재산을 의미 할 때 IVAR을 사용할 가능성이 적습니다.
  • init 및 dealloc에서 Mutator 방법 / 특성을 사용하지 마십시오. 나는 그것 때문에 나쁜 일이 없었지만, 당신이 당신의 객체의 상태에 의존하는 무언가를 수행하도록 방법을 변경하면 논리를 볼 수 있습니다.
  • Iboutlets를 속성에 넣습니다. 나는 실제로 여기서 이것을 읽었지만, 나는 그것을 시작할 것입니다. 메모리 이점에 관계없이 스타일이 더 좋아 보입니다 (적어도 나에게).
  • 절대 필요하지 않은 코드를 쓰지 마십시오. 이것은 실제로 Ivars를 만들 때와 같은 많은 것들을 다루고 있습니다. #define 데이터가 필요할 때마다 정렬하는 대신 배열을 수행하거나 배열을 캐싱합니다. 내가 이것에 대해 말할 수있는 것이 많지만 결론은 필요할 때까지 코드를 작성하지 않거나 프로파일 러가 당신에게 알려줍니다. 장기적으로 상황을 훨씬 쉽게 유지할 수 있습니다.
  • 시작한 것을 끝내십시오. 반 마감 처리 된 버기 코드는 프로젝트를 죽이는 가장 빠른 방법입니다. 괜찮은 스터브 방법이 필요한 경우 NSLog( @"stub" ) 내부 또는 또는 당신은 물건을 추적하고 싶습니다.

단위 테스트를 작성하십시오. 테스트 할 수 있습니다 많은 다른 프레임 워크에서 더 어려울 수있는 코코아의 것들. 예를 들어, UI 코드를 사용하면 일반적으로 물건이 필요한대로 연결되어 있고 사용될 때 작동한다고 신뢰할 수 있습니다. 그리고 State & Invoke 대의원 방법을 쉽게 설정하여 테스트 할 수 있습니다.

또한 내부에 대한 테스트를 작성하는 방식으로 공개 대 보호 대 개인 방법 가시성이 없습니다.

황금률 : 당신이 있다면 alloc 그럼 당신 release!

업데이트 : ARC를 사용하지 않는 한

java/c#/c ++/etc 인 것처럼 대 Objective-C를 작성하지 마십시오.

나는 한 팀이 Java EE 웹 응용 프로그램을 작성하는 데 사용되는 팀이 Cocoa 데스크탑 응용 프로그램을 작성하려고 시도하는 것을 보았습니다. 마치 Java EE 웹 응용 프로그램 인 것처럼. 그들이 정말로 필요한 모든 것이 Foo 클래스와 아마도 fooable 프로토콜 일 때 많은 초록 우주 락토리와 푸 락토리, ifoo와 foo가 날아갔습니다.

당신이 이것을하지 않도록하는 것의 일부는 언어의 차이점을 진정으로 이해하는 것입니다. 예를 들어, Objective-C 클래스 방법이 인스턴스 방법만큼 동적으로 파견되어 서브 클래스에서 무시할 수 있기 때문에 위의 추상 공장 및 공장 클래스가 필요하지 않습니다.

북마크를 가져와야합니다 디버깅 마법 페이지. 코코아 벌레의 소스를 찾으려고 노력하면서 벽에 머리를 두드릴 때 이것은 첫 번째 정지가되어야합니다.

예를 들어, 나중에 앱 종료 중에 충돌을 일으키는 메모리를 먼저 할당 한 방법을 찾는 방법을 알려줍니다.

사용자가 원하는 대로 문자열 정렬

사용자에게 표시할 문자열을 정렬할 때 간단한 구문을 사용하면 안 됩니다. compare: 방법.대신 항상 다음과 같은 지역화된 비교 방법을 사용해야 합니다. localizedCompare: 또는 localizedCaseInsensitiveCompare:.

자세한 내용은 다음을 참조하세요. 문자열 검색, 비교, 정렬.

내가 지금 내가 Newbiectororyaholism이라고 부르기로 결정한 것을 피하십시오. 객관적인 C에 새로 온 사람들이 카테고리를 발견 할 때 종종 hog 와일드로 가서 존재하는 모든 클래스에 유용한 작은 카테고리를 추가합니다 ("뭐? 숫자를 로마 숫자로 변환하는 방법을 추가 할 수 있습니다.").

이것을하지 마십시오.

코드는 2 개의 파운데이션 클래스 위에 뿌려진 수십 개의 작은 카테고리 메소드를 사용하여 더 휴대가 가능하고 이해하기 쉽습니다.

대부분의 경우 대부분 코드를 간소화하는 데 도움이되는 카테고리 메소드가 필요하다고 생각할 때 메소드를 재사용하지는 않습니다.

카테고리 방법 (그리고 완전히 미친 Ddribin 이외의 사람이 누구입니까?)를 네임터링하지 않는 한 다른 위험도 있습니다. Apple, 플러그인 또는 주소 공간에서 실행되는 다른 것이 동일한 범주를 정의 할 가능성이 있습니다. 부작용이 약간 다른 이름의 메소드 ....

확인. 이제 경고를 받았으므로 "이 부분을하지 마십시오"를 무시하십시오. 그러나 극단적 인 구속을 행사하십시오.

세상을 서브 클래스에 저항합니다. 코코아에서는 다른 프레임 워크에서 서브 클래싱을 통해 수행되는 기본 런타임의 대표와 사용을 통해 많은 일이 이루어집니다.

예를 들어, Java에서는 익명 인스턴스를 사용합니다. *Listener 서브 클래스를 많이하고 .NET에서 당신은 당신을 사용합니다 EventArgs 서브 클래스가 많이 있습니다. 코코아에서는 하나도하지 않습니다. 대상 활동이 대신 사용됩니다.

선언 된 속성

일반적으로 모든 속성에 대한 Objective-C 2.0 선언 속성 기능을 사용해야합니다. 공개되지 않은 경우 클래스 확장에 추가하십시오. 선언 된 속성을 사용하면 메모리 관리 시맨틱이 즉시 명확 해지고 거래 방법을 더 쉽게 확인할 수 있습니다. 재산 선언을 함께 그룹화하면 신속하게 스캔하고 DENCELOC 메소드의 구현과 비교할 수 있습니다.

속성을 '비 원자'로 표시하지 않기 전에 열심히 생각해야합니다. 처럼 목표 C 프로그래밍 언어 가이드 참고, 속성은 기본적으로 원자이며 상당한 오버 헤드가 발생합니다. 또한, 단순히 모든 속성을 원자를 만들면 응용 프로그램 스레드 안전이 만들어지지 않습니다. 또한 '비 원자'를 지정하지 않고 자신의 액세서 방법을 구현하지 않고 (합성하지 않고) 원자 방식으로 구현해야합니다.

nil 값에 대해 생각하십시오

처럼 이 질문 메모, 메시지 nil Objective-C에서 유효합니다. 깨끗하고 자연스러운 코드로 이어지는이 장점은 종종 이점이지만,이 기능은 때때로 당신이 nil 당신이 그것을 기대하지 않았을 때의 가치.

nsassert와 친구를 사용하십시오. 나는 항상 유효한 객체로 NIL을 사용합니다 ... 특히 NIL에 메시지를 보내는 것은 OBJ-C에서 완벽하게 유효합니다. 그러나 변수의 상태에 대해 정말로 확인하려면 NSAssert 및 NSParameterAssert를 사용하여 문제를 쉽게 추적하는 데 도움이됩니다.

단순하지만 잊혀진 하나. 사양에 따라 :

일반적으로 동일한 선택기 (동일한 이름)를 갖는 다른 클래스의 메소드는 동일한 반환 및 인수 유형을 공유해야합니다. 이 제약 조건은 컴파일러에 의해 동적 결합을 허용합니다.

이 경우 동일한 이름의 선택기를 다른 클래스에 있더라도, 동일한 반환/인수 유형이있는 것으로 간주됩니다. 간단한 예입니다.

@interface FooInt:NSObject{}
-(int) print;
@end

@implementation FooInt
-(int) print{
    return 5;
}
@end

@interface FooFloat:NSObject{}
-(float) print;
@end

@implementation FooFloat
-(float) print{
    return 3.3;
}
@end

int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
    id f1=[[FooFloat alloc]init];
    //prints 0, runtime considers [f1 print] to return int, as f1's type is "id" and FooInt precedes FooBar
    NSLog(@"%f",[f1 print]);

    FooFloat* f2=[[FooFloat alloc]init];
    //prints 3.3 expectedly as the static type is FooFloat
    NSLog(@"%f",[f2 print]);

    [f1 release];
    [f2 release]
    [pool drain];

    return 0;
}   

Leopard (Mac OS X 10.5) 이상을 사용하는 경우 계측기 애플리케이션을 사용하여 메모리 누출을 찾아 추적 할 수 있습니다. Xcode에서 프로그램을 구축 한 후 실행> 성능 도구> 누출로 시작하십시오.

앱에 누출이 표시되지 않더라도 물체를 너무 오래 보관할 수 있습니다. 악기에서는이를 위해 Objectalloc 악기를 사용할 수 있습니다. 악기 문서에서 Objectalloc 악기를 선택하고 View> 세부 사항을 선택하여 악기의 세부 사항 (아직 표시되지 않은 경우)을 가져옵니다 (옆에 확인 표시가 있어야 함). Objectalloc 세부 사항의 "할당 수명"에서 "생성 및 아직 살아있는"옆에있는 라디오 버튼을 선택하십시오.

이제 응용 프로그램 녹화를 중지 할 때마다 Objectalloc 도구를 선택하면 "# net"열의 응용 프로그램에 여전히 살아있는 각 객체에 대한 참조가 얼마나 표시되는지 표시됩니다. 자신의 클래스뿐만 아니라 NIB 파일의 최상위 객체의 클래스를 살펴보십시오. 예를 들어 화면에 창이없고 여전히 생생한 nswindow에 대한 참조가 표시되면 코드에서 해제되지 않았을 수 있습니다.

Dealloc에서 정리하십시오.

이것은 가장 잊을 수있는 가장 쉬운 것 중 하나입니다. 150mph에서 코딩 할 때. 항상, 항상, 항상 Dealloc에서 속성/멤버 변수를 정리하십시오.

나는 OBJC 2 속성을 사용하는 것을 좋아합니다 - ~와 함께 새로운 도트 표기법 - 따라서 이것은 정리가 통증이 없습니다. 종종 간단한 것 :

- (void)dealloc
{
    self.someAttribute = NULL;
    [super dealloc];
}

이것은 당신을 위해 릴리스를 처리하고 NULL로 속성을 설정합니다 (방어 프로그래밍을 고려합니다. DealLoc의 또 다른 방법이 회원 변수에 다시 액세스하는 경우 - 드물지만 드물지만. ~할 수 있었다 일어나다).

GC가 10.5로 켜져 있으면 더 이상 필요하지 않지만 여전히 생성 한 다른 자원을 정리해야 할 수도 있습니다. 대신 최종 방법으로 수행 할 수 있습니다.

이 모든 의견은 훌륭하지만 아무도 언급하지 않았다는 사실에 정말 놀랐습니다. Google의 목표 C 스타일 가이드 그것은 얼마 전에 출판되었습니다. 나는 그들이 매우 철저한 일을했다고 생각합니다.

또한 반 관련 주제 (더 많은 응답을위한 공간 포함!) :

2 년 전에 알고 싶은 작은 Xcode 팁과 요령은 무엇입니까?.

NSWINDOWCONTROLLER 및 NSVIEWCONTROLLER가 관리하는 NIB 파일의 최상위 객체를 출시한다는 것을 잊지 마십시오.

NIB 파일을 수동으로로드하면 NIB의 최상위 객체를 완료 할 때 해당 NIB의 최상위 객체를 공개해야합니다.

초보자가 사용할 수있는 분명한 것 : 코드에 Xcode의 자동 인테이션 기능을 활용하십시오. 다른 소스에서 복사/붙여 넣기를하더라도 코드를 붙여 넣은 후에는 전체 코드 블록을 선택하고 마우스 오른쪽 버튼을 클릭 한 다음 해당 블록 내의 모든 것을 다시 표시 할 옵션을 선택할 수 있습니다.

Xcode는 실제로 해당 섹션을 통해 구문 분석하고 브래킷, 루프 등을 기준으로 들여 쓰기합니다. 모든 라인에 대한 우주 막대 또는 탭 키를 누르는 것보다 훨씬 효율적입니다.

코코아 프로그래밍에 처음 들어갈 때 이것을 간과 한 것을 알고 있습니다.

NIB 파일과 관련하여 메모리 관리 책임을 이해해야합니다. 귀하는로드 한 펜촉 파일에서 최상위 객체를 공개 할 책임이 있습니다. 읽다 애플의 문서 주제에.

모든 GCC 경고를 켜면 Apple의 헤더로 인해 정기적으로 발생하는 경고를 끄고 소음을 줄입니다.

또한 Clang 정적 분석을 자주 실행합니다. "정적 분석기 실행"빌드 설정을 통해 모든 빌드에 대해 활성화 할 수 있습니다.

단위 테스트를 작성하고 각 빌드마다 실행하십시오.

변수 및 속성

1/ 헤더를 깔끔하게 유지하고 구현을 숨깁니다.
헤더에 인스턴스 변수를 포함하지 마세요.개인 변수는 속성으로 클래스 연속에 추가됩니다.공개 변수는 헤더에서 공개 속성으로 선언됩니다.읽기 전용이어야 하는 경우 읽기 전용으로 선언하고 클래스 연속에서 읽기 쓰기로 덮어씁니다.기본적으로 저는 변수를 전혀 사용하지 않고 속성만 사용합니다.

2/ 속성에 기본이 아닌 변수 이름을 지정합니다. 예:


@synthesize property = property_;

이유 1:속성을 할당할 때 "self."를 잊어버려 발생하는 오류를 catch할 수 있습니다.이유 2:내 실험에 따르면 Instruments의 누출 분석기는 기본 이름으로 누출 속성을 감지하는 데 문제가 있습니다.

3/ 속성에 직접 유지 또는 해제를 사용하지 마십시오(또는 매우 예외적인 상황에서만).귀하의 dealloc에서 nil을 할당하십시오.보유 속성은 보유/해제를 자체적으로 처리하기 위한 것입니다.예를 들어 setter가 관찰자를 추가하거나 제거하지 않는지 여부는 알 수 없습니다.해당 setter 및 getter 내에서만 변수를 직접 사용해야 합니다.

견해

1/ 가능하다면 모든 보기 정의를 xib에 넣으십시오(예외는 일반적으로 동적 컨텐츠 및 레이어 설정입니다).시간을 절약하고(코드 작성보다 쉽습니다) 변경하기 쉽고 코드를 깨끗하게 유지합니다.

2/ 조회수를 줄여서 조회수를 최적화하려고 하지 마세요.하위 뷰를 추가하려는 이유만으로 xib 대신 코드에 UIImageView를 생성하지 마세요.대신 UIImageView를 배경으로 사용하세요.뷰 프레임워크는 문제 없이 수백 개의 뷰를 처리할 수 있습니다.

3/ IBOutlet은 항상 유지(또는 강력)할 필요는 없습니다.대부분의 IBOutlet은 뷰 계층 구조의 일부이므로 암시적으로 유지됩니다.

4/ viewDidUnload의 모든 IBOutlet을 해제합니다.

5/ dealloc 메소드에서 viewDidUnload를 호출합니다.암시적으로 호출되지는 않습니다.

메모리

1/ 객체를 생성할 때 객체를 자동 해제합니다.릴리스 호출을 하나의 if-else 분기로 이동하거나 return 문 다음에 이동하면 많은 버그가 발생합니다.자동 릴리스 대신 릴리스는 예외적인 상황에서만 사용해야 합니다.런루프를 기다리고 있고 객체가 너무 일찍 자동 해제되는 것을 원하지 않을 때.

2/ 인증된 참조 카운팅을 사용하더라도 유지-해제 방법이 어떻게 작동하는지 완벽하게 이해해야 합니다.수동으로 유지 해제를 사용하는 것은 ARC보다 더 복잡하지 않습니다. 두 경우 모두 누출 및 유지 주기에 대해 고려해야 합니다.대규모 프로젝트나 복잡한 객체 계층에서는 수동으로 유지-해제 사용을 고려해보세요.

코멘트

1/코드를 자동 문서화하세요.모든 변수 이름과 메소드 이름은 그것이 무엇을 하고 있는지 알려주어야 합니다.코드가 올바르게 작성되면(많은 연습이 필요함) 코드 주석이 필요하지 않습니다(문서 주석과 동일하지 않음).알고리즘은 복잡할 수 있지만 코드는 항상 단순해야 합니다.

2/ 때로는 의견이 필요할 수도 있습니다.일반적으로 명확하지 않은 코드 동작이나 해킹을 설명합니다.주석을 작성해야 한다고 생각되면 먼저 주석이 필요하지 않고 더 간단하게 코드를 다시 작성해 보십시오.

들여 쓰기

1/ 들여쓰기를 너무 많이 늘리지 마십시오.대부분의 메소드 코드는 메소드 수준에서 들여쓰기되어야 합니다.중첩된 블록(if, for 등)은 가독성을 떨어뜨립니다.세 개의 중첩된 블록이 있는 경우 내부 블록을 별도의 메서드에 넣어야 합니다.4개 이상의 중첩 블록을 사용하면 안 됩니다.대부분의 메소드 코드가 if 내부에 있는 경우 if 조건을 무효화하십시오. 예:


if (self) {
   //... long initialization code ...
}

return self;


if (!self) {
   return nil;
}

//... long initialization code ...

return self;

C 코드, 주로 C 구조체를 이해합니다.

Obj-C는 C 언어에 대한 가벼운 OOP 레이어일 뿐입니다.C의 기본 코드 구조(열거형, 구조체, 배열, 포인터 등)가 어떻게 작동하는지 이해해야 합니다.예:


view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + 20);

와 같다:


CGRect frame = view.frame;
frame.size.height += 20;
view.frame = frame;

그리고 더 많은

자신만의 코딩 표준 문서를 관리하고 자주 업데이트하세요.버그로부터 배우려고 노력하십시오.버그가 생성된 이유를 이해하고 코딩 표준을 사용하여 버그를 방지하도록 노력하세요.

우리의 코딩 표준은 현재 Java 코딩 표준, Google Obj-C/C++ 표준 및 자체 추가 사항이 혼합된 약 20페이지로 구성되어 있습니다.코드를 문서화하고 표준 표준 들여쓰기, 공백 및 빈 줄을 올바른 위치에 사용하십시오.

더 이상 기능의.

Objective-C는 객체 지향 언어이지만 Cocoa 프레임 워크 기능 스타일 인식이며 많은 경우 기능적 스타일입니다.

  1. 돌연변이의 분리가 있습니다. 사용 불변 클래스는 1 차, 부차적 인 물체로서의 클래스. 예를 들어, NSARRAY를 주로 사용하고 필요할 때만 NSMutableARRAY를 사용하십시오.

  2. 순수한 기능이 있습니다. 많은 프레임 워크 API를 구매하는 것은 순수한 기능처럼 설계되었습니다. 다음과 같은 기능을보십시오 CGRectMake() 또는 CGAffineTransformMake(). 분명히 포인터 형태가 더 효율적으로 보입니다. 그러나 포인터와의 간접 논쟁은 부작용을 제공 할 수 없습니다. 가능한 한 순전히 구조를 설계합니다. 상태 대상을 분리합니다. 사용 -copy 대신에 -retain 다른 객체에 값을 전달할 때. 공유 상태는 다른 물체에서 조용히 가치에 대한 돌연변이에 영향을 줄 수 있기 때문입니다. 따라서 부작용은 없습니다. 객체의 외부 값이있는 경우 복사하십시오. 따라서 가능한 한 최소한의 공유 상태를 설계하는 것도 중요합니다.

그러나 불순한 기능을 사용하는 것을 두려워하지 마십시오.

  1. 게으른 평가가 있습니다. 같은 것을 본다 -[UIViewController view] 재산. 객체가 만들어지면보기가 생성되지 않습니다. 발신자가 읽을 때 만들어집니다 view 처음에 재산. UIImage 실제로 그려 질 때까지로드되지 않습니다. 이 디자인과 같은 많은 구현이 있습니다. 이런 종류의 디자인은 자원 관리에 매우 도움이되지만 게으른 평가의 개념을 모른다면 행동을 이해하기 쉽지 않습니다.

  2. 폐쇄가 있습니다. 가능한 한 C- 블록을 사용하십시오. 이것은 당신의 삶을 크게 단순화 할 것입니다. 그러나 사용하기 전에 블록 메모리 관리에 대해 다시 읽어보십시오.

  3. 반자동 GC가 있습니다. nsautoreleasepool. 사용 -autorelease 일 순위. 매뉴얼을 사용하십시오 -retain/-release 정말로 필요할 때 이차. (예 : 메모리 최적화, 명시 적 리소스 삭제)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top