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
이기 때문에 그 범위는 그 자체입니다.name
todo
다른 외부 기능도이를 수정하지 않습니다.
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 게시물을 읽고 변수 속성 속성을 확인하는 데모 앱을 만든 후 모든 속성 정보를한데 모으기로 결정했습니다.
- 원자 // 기본값
- 비 원자
- strong = retain // 기본값
- weak = unsafe_unretained
- 유지
- // default 할당
- unsafe_unretained
- 부
- 읽기 전용
- 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!!
- 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;
- 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
'IT Share you' 카테고리의 다른 글
Spring-Annotation Based Controller-쿼리 문자열 기반 RequestMapping (0) | 2021.01.10 |
---|---|
문자열을 반복하고 인덱스 (현재 위치)를 어떻게 알 수 있습니까? (0) | 2021.01.10 |
ListView에서 부모로 스크롤 이벤트 버블 링 (0) | 2021.01.10 |
Bash에서 날짜 구문 분석 (0) | 2021.01.10 |
Java에서 클래스 리터럴이란 무엇입니까? (0) | 2021.01.10 |