목표 c /iPhone : nsarray를 다시 초기화 할 수 있습니까?
-
20-09-2019 - |
문제
비 변이성 데이터 유형은 일단 생성되면 수정할 수 없다는 것을 읽었습니다. (예 : nsstring 또는 nsarray).
그러나 다른 객체 세트를 가리키기 위해 재직 할 수 있습니까?
그렇다면 릴리스를 사용하여 사용 사이에서 처음으로 할당을 해제합니까? 예 :
MyArray는 인터페이스에서 nsArray *myArray로, 비 원자/유지 속성을 유지합니다. 초기화 코드에서 다음과 같이 다양한 문자열로 설정되었습니다.
self.myArray = [myString componentsSeparatedByString:@","];
그러나 나중에 나는 다른 문자열 세트를 가리키기 위해 MyArray를 다시 시작하고 싶습니다.
self.myArray = [myOtherString componentsSeparatedByString:@","];
가능합니까? 감사...
해결책
예, 당신은 nsarray를 다시 이용할 수 있습니다. 다음은 NSARRAY를 다시 시작하는 데 사용한 샘플 코드입니다.
NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;
keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
다른 팁
그것은 당신이 의미하는 바에 달려 있습니다 다시 시작하십시오. 당신은 할당 할 수 있습니다 또 다른 포인터가 일정하지 않기 때문에 포인터에 불변의 대상.
예시:
@interface MyObj : NSObject {
NSString *name; // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name; // sane people use copy instead of retain
// whenever possible. Using retain can
// lead to some hard to find errors.
@end
/* ... another file ... */
MyObj *theObject = [[[MyObj alloc] init] autorelease];
theObject.name = @"Peter";
NSString *oldName = theObject.name;
NSLog(@"%@", theObject.name); // -> Peter
NSLog(@"%@", oldName); // -> Peter
theObject.name = @"Martin";
NSLog(@"%@", theObject.name) // -> Martin
NSLog(@"%@", oldName) // -> Peter
위의 행동이 당신이 원하는 것이라면 괜찮습니다.
마지막 줄이 돌아 오기를 원한다면 남자 이름 당신은 어려움에 처해있다. 그것들은 끊임없는 현이며입니다 ~ 아니다 수정을 의미합니다. 정말로 원한다면 객체의 메모리를 직접 수정할 수는 있지만 이것은 위험합니다 권장하지 않습니다. 그러한 동작이 필요한 경우 변동성 객체를 사용하십시오.
물론 그들은 할 수 있습니다. 그 말을 말합니다 NSArray
불변은 해당 유형의 클래스의 속성을 변경할 수 없다는 것을 의미하지는 않습니다. 콘텐츠를 변경할 수는 없지만 새 콘텐츠를 할당 할 수 있습니다.
참조를 불가능하게 변경하려면 사용해야합니다. const
예어.