iOS FAQ
Question
iOS 학습 과정에서 이런저런 의문을 만날 수 있고 항상 잊어버리며 기억력이 썩은 펜촉보다 못하다. 여기서 자신이 겪은 문제를 하나하나 덧붙여 자신의 문제집으로 삼는다.
1. IBOutlet이 연결된 보기 속성은 왜 strong이 아닌 weak으로 설정됩니까?
왜 weak로 설정되었는지 이해하려면 먼저 strong과 weak의 차이를 명확히 해야 한다. strong에 의해 수식된 속성은 강한 지침으로 이해할 수 있고 인용된 대상의 인용 계수는 +1이고 weak에 의해 수식된 대상은 그렇지 않다.
다음은 IBOutlet 연결을 통해 얻어진 weak 속성 btn이 IB가 만든 대상 myButton을 인용한 후, 즉 코드 줄(1)을 실행한 후, 약한 바늘만 mybutton을 인용했기 때문에 myButton은 즉시 방출해야 한다. 그러나 사실은 그렇지 않다. myButton은 방출하지 않았다. why?my Button을 인용하는 또 다른 강력한 바늘이 있을 거라고 상상할 수 있다.사실은 IB에서 만들어진 button에 이러한 인용 관계가 존재한다. UIViewController->UIView->subView->UIButton. 즉, myButton의 부류가 그것을 강제로 인용했다. 부류view가 있는 한 myButton은 풀리지 않는다. 부류view가 풀리면 아들인 myButton도 존재할 가치가 없기 때문에 weak을 사용하는 것은 문제없다. 물론 너도 strong을 사용할 수 있다. 기쁘기 때문이다.@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// myButton IB button;btn myButton,btn weak
,myButton
self.btn = myButton; //(1)
}
@end
2. 왜 NSString 속성(또는 NSArray, NSDictionary)에서 자주 copy 수식을 사용합니까?
NSString 속성은 copy 키워드로 수식하는 것을 자주 보는데 NSString은 copy로 수식하는 것이 가장 좋지 않습니까?모든 일은 절대적이지 않다. 코피도 마찬가지다. 코피를 사용하는 이유는 NSString 속성의 안전을 위해서다. 다음과 같다. mystr가 strong으로 수식할 때 그 초기화는 NSMutable String: yourStr에서 나온다. yourStr가 바뀔 때 mystr도 따라서 바뀐다. 코피로 수식할 때 mystr에 값을 부여할 때 yourStr는 변하지 않는 문자열(심도 복사, 내용 복사)을 복사하기 때문에 원본을 수정할 때 mystr도 영향을 받지 않는다.@property (nonatomic, strong) NSString *myStr;
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *yourStr = [[NSMutableString alloc]initWithString:@"1"];
self.myStr = yourStr;
[yourStr appendString:@"2"];
NSLog(@"str=%@",yourStr);
NSLog(@"self.myStr=%@",self.myStr);
}
/*strong :
str=12
self.myStr=12
copy :
str=12
self.myStr=1
*/
코피 안전한데 왜 다 코피 안 써요?사실상self를 실행하고 있습니다.mystr = yourStr에서 이러한 조작이 있을 때self.myStr = [yourStr copy];copy에서 원본을 판단합니다if([your Str is Member OfClass: [NSMutable String class]))) 가변string이 없으면 얕은 복사를 하고 새로운 대상이 생기지 않으며 가변string이면 깊은 복사를 해서 새로운 대상이 생깁니다.이 판단 작업은 NSString이 많을 때 비용이 많이 들기 때문에 @ "변하지 않는 형식"을 확인할 수 있다면 strong을 사용하십시오. 그렇지 않으면 코피를 사용합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// myButton IB button;btn myButton,btn weak
,myButton
self.btn = myButton; //(1)
}
@end
@property (nonatomic, strong) NSString *myStr;
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *yourStr = [[NSMutableString alloc]initWithString:@"1"];
self.myStr = yourStr;
[yourStr appendString:@"2"];
NSLog(@"str=%@",yourStr);
NSLog(@"self.myStr=%@",self.myStr);
}
/*strong :
str=12
self.myStr=12
copy :
str=12
self.myStr=1
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.