strong, weak,retain,assign의 차이 @property 매개 변수

5902 단어 property

strong, weak,retain,assign의 차이 @property 매개 변수


경험을 먼저 말하다


사용처
  • copy:NSString,block,
  • weak: UI 컨트롤, 에이전트
  • strong: 일반 대상, 사용자 정의 대상
  • OC에서: 기본적으로 대상에 대한 강한 인용;대상이 강한 인용이 없으면 즉시 풀려납니다
  • assign: 기본 데이터 유형, 구조체, 매거, 비OC 대상 유형
  • 이하는 쓸데없는 말이 비교적 많다

  • strong과 weak은 ARC에서 새로 도입한 대상 변수 속성
  • xcode 4.2(ios sdk4.3과 이하 버전)와 이전 버전은retain과 assign을 사용하고 ARC를 지원하지 않습니다.
  • xcode4.3(ios5와 이상 버전) 이후 ARC가 생겼고strong과 weak
  • 을 사용하기 시작했다.

    strong,weak,retain,assign의 차이


    assign

  • assign: 비지침 변수에 사용합니다.기본 데이터 형식(예를 들어 NSInteger)과 C 데이터 형식(int,float,double,char, 등)에 사용되며, @property(nonatomic,assign) int number, @property (nonatomic, assign) id className;//id는 assign
  • 을 사용해야 합니다.
  • 어쨌든 기억해라: 앞에'*'가 필요 없는 건 assign으로 하자
  • retain

  • retain: 포인터 변수에 사용합니다.즉, 당신이 변수를 정의한 후에 이 변수는 프로그램이 실행되는 과정에서 변경되고 다른 방법에 영향을 미친다는 것이다.일반적으로 문자열(NSString, NSMutableString), 배열(NSMutableArray, NSArray), 사전 대상, 보기 대상(UIView), 컨트롤러 대상(UIViewController) 등
  • 예:
  • @property (nonatomic,retain) NSString * myString; @property (nonatomic, retain) UIView * myView; @property (nonatomic, retain) UIViewController * myViewController; 
  • xcode 4.2는 ARC를 지원하지 않기 때문에 retain을 자주 사용하여 수식하고 다 쓰고 방출합니다. xcode4.3 ARC를 지원하고 리테일을 사용할 수 있으며 수동으로 메모리를 방출하지 않아도 시스템이 자동으로 완성합니다
  • xcode4.3 위에서 개발한 바와 같이retian과strong은 모두 똑같고 차이가 없다
  • strong 및 weak:

  • 행당 왼쪽이 오른쪽
  • 에 해당합니다.
    @property(nonatomic,retain) MyClass *myObject;
    @property(nonatomic,strong) MyClass *myObject;
    @property(nonatomic,assign )iddelegate;
    @property(nonatomic, weak )iddelegate;
  • 현재 시스템이 자동으로 생성하는 속성은 모두 weak으로 수식된 것이다. 내 생각에 xcode4.2는 ARC를 지원하지 않기 때문에 모두retain을 사용한다.
  • 현재 xcode4.3 ARC를 지원하기 때문에 애플은 프로그래머에게 리턴을 포기하고 앞으로 위크를 사용하라고 조언했다.
  • weak은 assign에 해당하고 xcode4.3 개발 환경에서 assign 대신 weak 사용을 포기
  • unsafe_unretained unsafe_unretained는ios5버전 이하의assign,즉unsafeunretained,weak,assign 세 개 다 똑같아요.왜냐하면 ios5는 weak을 사용하기 때문에 ios4에 있어요.3 사용할 수 없습니다. weak을 unsafe로 변경하면unretained, 그럼 사용할 수 있어요.결국 iOS 5 이전 시스템은 weak 대신 이 속성을 사용했다.
  • 하나의 클래스가 NSObject를 계승하면 이 클래스의 속성은copy를 사용해야 한다. 예를 들어:
  • #import <Foundation/Foundation.h> #import <MapKit/MKAnnotation.h> @interface Annotation : NSObject <MKAnnotation> { CLLocationCoordinate2D coordinate; NSString *title; NSString *subtitle; } @property (nonatomic) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; @end 

    readonly

  • 이 표시는 속성이 읽기 전용임을 설명합니다. 기본 표시는 읽기와 쓰기입니다. 읽기 전용을 지정하면 @implementation에서 읽기만 필요합니다.@synthesize 키워드를 사용하면, 읽기 방법이 해석됩니다.그리고 만약 점 조작부호를 속성에 값을 부여하려고 한다면, 컴파일 오류가 발생할 것입니다.

  • readwrite

  • 이 표시는 속성이 읽기와 쓰기로 되어 있음을 설명하는데 이것도 기본 속성입니다.설정기와 리더는 @implementation에서 실행되어야 합니다.@synthesize 키워드를 사용하면 리더와 설정기가 해석됩니다.

  • assign

  • 이 표시는 설정기가 직접 값을 부여하는 것을 설명하는데 이것도 기본값이다.쓰레기 수집을 사용하는 프로그램에서 assign을 사용하고 NSCopying 프로토콜에 맞는 속성을 원한다면 기본값을 간단하게 사용하지 않고 이 표시를 명확하게 지적해야 한다. 그렇지 않으면 컴파일 경고를 받을 것이다.이것은 컴파일러에게 복사할 수 있어도 값을 부여해야 한다는 것을 다시 한 번 설명한다.

  • retain

  • retain이 값을 부여할 때 전송된retain 메시지를 깨우도록 지정합니다.이 속성은 Objective-C 객체 유형에만 사용할 수 있으며 Core Foundation 객체에는 사용할 수 없습니다.(원인은 명백하다.retain은 대상의 인용 계수를 증가시킬 수 있지만 기본 데이터 형식이나CoreFoundation 대상은 인용 계수가 없다--역자 주석).

  • copy

  • 값을 부여할 때 전송된 값의 복사본을 사용한다고 지적했다.복제 작업은 copy 메소드에 의해 수행되며 NSCopying 프로토콜이 실행된 객체 유형에만 적용됩니다."보다 자세한 내용은""복제""섹션을 참조하십시오."

  • nonatomic

  • 액세서리는 원자 조작이 아니라 기본적으로 액세서리는 원자 조작이라고 지적했다.즉, 다중 스레드 환경에서 해석된 액세서리는 속성에 대한 안전한 접근을 제공하고, 액세서리에서 받은 반환값이나 설정기를 통해 설정된 값을 한 번에 완성할 수 있으며, 다른 스레드라도 접근을 하고 있다.nonatomic를 지정하지 않으면 메모리를 관리하는 환경에서 해석된 액세서리가 되돌아오는 값을 보존하고 자동으로 방출합니다. nonatomic를 지정하면 액세서리는 간단하게 이 값을 되돌려줍니다.

  • @property 매개 변수

  • 메모리 관리 관련 매개 변수
  • Retain: 대상release 옛 값,retain 새 값(OC 대상 유형에 적용)
  • Assign: 직접 할당(기본값, 비oc 대상 유형에 적용)
  • Copy:release 이전 값,copy 새 값
  • set 방법을 생성할지 여부(속성만 읽으면 생성하지 않음)
  • Readonly: 읽기만 하고 Getter의 성명과 실현만 생성
  • Readwrite: 기본적으로setter와getter의 성명과 실현을 동시에 생성
  • 다중 스레드 관리(애플은 어느 정도 다중 스레드 조작을 차단했다)
  • Nonatomic: 고성능, 보통 이걸로
  • Atomic: 저성능
  • Set 및 get 메서드의 이름
  • set과 get 방법의 이름을 수정합니다. 주로 볼 형식에 사용됩니다.브리 형식으로 돌아가는 방법 이름은 일반적으로 is로 시작하기 때문에, 이름 수정은 브리 형식의 Getter에 사용됩니다.


  • @propery(setter=setAbc,getter=isRich) BOOL rich;
    BOOL b=p.isRich;//호출

    좋은 웹페이지 즐겨찾기