IT Share you

Objective-C 101 (유지 vs 할당) NSString

shareyou 2021. 1. 10. 19:23
반응형

Objective-C 101 (유지 vs 할당) NSString


101 개의 질문

내가 자동차 데이터베이스를 만들고 각 자동차 객체가 다음과 같이 정의되어 있다고 가정 해 보겠습니다.

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;

@property(nonatomic, retain) NSString *name;그렇지 @property(nonatomic, assign) NSString *name;않습니까?

나는 assign참조 카운터를 증가시키지 않는다는 것을 이해합니다 retain. 그러나을 사용하는 이유 객체의 구성원 retain이기 때문에 그 범위는 그 자체입니다.nametodo

다른 외부 기능도이를 수정하지 않습니다.


Objective-C에는 "객체의 범위"와 같은 것이 없습니다. 범위 규칙은 개체의 수명과 관련이 없습니다. 유지 횟수가 모든 것입니다.

일반적으로 인스턴스 변수의 소유권을 주장해야합니다. Objective-C 메모리 관리 규칙을 참조하십시오 . retain속성을 사용하면 속성 설정자가 새 값의 소유권을 주장하고 이전 값의 소유권을 포기합니다. assign특성, 주변의 코드는 책임과의 분리면에서 엉망으로되는,이 작업을 수행 할 수 있습니다. assign속성 을 사용하는 이유 는 값을 유지할 수없는 경우 (예 : BOOL 또는 NSRect와 같은 비 객체 유형) 또는 유지하면 원치 않는 부작용이 발생하기 때문입니다.

덧붙여서 NSString의 경우 올바른 종류의 속성은 일반적으로 copy. 누군가가 인 NSMutableString에 통과하면 그 방법은 (- 그것은 유효한 당신 아래에서 변경할 수 있다 는 NSString의 종류).


그리고 그것을 통해 액세스하는 것을 잊지 마십시오

self.name = something;

때문에

name = something;

생성 된 setter / getter 메서드는 신경 쓰지 않고 대신 값을 직접 할당합니다.


없이 retain보장이없는 NSString*사용자가 설정하는 name과는 할당 문 자체보다 더 오래 살 것이다. retain합성 된 setter 속성을 사용하면 메모리 관리 시스템에 NSString*주변 을 유지하는 데 관심이있는 객체가 하나 이상 있음을 알릴 수 있습니다 .


그것을 찾는 사람들을 위해 속성 속성에 대한 Apple의 문서는 여기에 있습니다 .


self.에서 :

self.name = something;

중요하다! 이것이 없으면 변수에 직접 액세스하고 setter를 우회합니다.

이전 스타일 (내가 틀렸다면 수정)은 다음과 같을 것입니다.

[self setName:something];

어쨌든,이 표기법 내가 제대로 찾아 갔을 때 내가 정말 필요로하는 (왠지 익숙한 소리)의 조언이었다 @properties에가 NSStrings. 감사합니다 Axel.


많은 기사, SO 게시물을 읽고 변수 속성 속성을 확인하는 데모 앱을 만든 후 모든 속성 정보를한데 모으기로 결정했습니다.

  1. 원자 // 기본값
  2. 비 원자
  3. strong = retain // 기본값
  4. weak = unsafe_unretained
  5. 유지
  6. // default 할당
  7. unsafe_unretained
  8. 읽기 전용
  9. readwrite // 기본값

so below is the detailed article link where you can find above mentioned all attributes, that will defiantly help you. Many thanks to all the people who give best answers here!!

Variable property attributes or Modifiers in iOS

  1. retain = strong
    • it is retained, old value is released and it is assigned
    • retain specifies the new value should be sent -retain on assignment and the old value sent -release
    • retain is the same as strong.
    • apple says if you write retain it will auto converted/work like strong only.
    • methods like "alloc" include an implicit "retain"

Example:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. assign
    • assign is the default and simply performs a variable assignment
    • assign is a property attribute that tells the compiler how to synthesize the property's setter implementation
    • I would use assign for C primitive properties and weak for weak references to Objective-C objects.

Example:

@property (nonatomic, assign) NSString *address;

@synthesize address;

Google's Objective-C Style Guide covers this pretty well:

Setters taking an NSString, should always copy the string it accepts. Never just retain the string. This avoids the caller changing it under you without your knowledge. Don't assume that because you're accepting an NSString that it's not actually an NSMutableString.


Would it be unfortunate if your class got this string object and it then disappeared out from under it? You know, like the second time your class mentions that object, it's been dealloc'ed by another object?

That's why you want to use the retain setter semantics.

ReferenceURL : https://stackoverflow.com/questions/1380338/objective-c-101-retain-vs-assign-nsstring

반응형