끌어서 놓은 파일 (NSURL
)을 허용하는보기 기반 NSTableView가있는 샌드 박스 ARC 응용 프로그램을 작성하고 있습니다. 나는 테이블 뷰에 하나 개의 파일을 드래그 할 수 있습니다makeViewWithIdentifier를 호출합니다. owner : ARC가 ivar을 다시 만듭니다.
- (NSView *)tableView:(NSTableView *)tv
viewForTableColumn:(NSTableColumn *)tc
row:(NSInteger)row
{
// `files' is an NSMutableArray* ivar containing NSURLs
// that have been dropped into this table
NSURL *url = [files objectAtIndex:row];
NSString *fileName = [url lastPathComponent];
NSImage *icon = [self iconForURL:url];
NSTableCellView *view = [tv makeViewWithIdentifier:[tc identifier] owner:self];
[[view textField] setStringValue:fileName];
[[view imageView] setImage:icon];
return view;
}
하고 올바르게 표시 나는 다음 NSTableViewDelegate
방법에 몇 가지 중요한 기묘에 달렸다. 내가 두 번째 파일을 드래그 할 때, 나는이 오류 얻을 : - 실제로 새 개체 인스턴스가된다 - makeViewWithIdentifier:owner:
호출 후
*** Canceling drag because exception 'NSRangeException' (reason '*** -[__NSArrayM insertObject:atIndex:]: index 1 beyond bounds for empty array') was raised during a dragging session
디버거를 통해 스테핑을, 나는 files
는 "빈 될"것을 발견했다. 나는 이것이 내가 이해할 수없는 ARC의 일부분이라고 가정한다. 그러나 그 물체는 자신의 ivar (기본적으로)에 대한 강한 참조를 가지고있다. 어떻게 내게 공개되어 다시 만들어 지나요? (향후 릴리스에 강한 참조를 보관합니다 바라고)
- 테이블 셀 뷰의 소유자로 바르를 통과;
나는이 문제를 해결하기 위해 두 해킹 때우기 또는
- ivar의 개체를 가리키고 ivar을 이전 개체에 다시 할당하는 로컬 변수를 만듭니다 (그 동안 대체 배열을 생성하므로 분명히 낭비입니다).
무엇이 여기에 있습니까? 이러한 대안은 필요하지 않습니다.
이 문제를 방지하는 방법에 대한 표준 패턴이 있습니까 - 다른 곳에서 인스턴스 변수를 초기화하는가? – Richard
위의 업데이트 된 솔루션을 참조하십시오. '-awakeFromNib'의 ivar 초기화가 표준입니다. 소유자를 올바르게 처리하면 모든 것이 잘됩니다. –