2013-10-07 5 views
2

ABRecordRef를 만들고 그 속성을 설정하고 ref를 반환하는 메서드가 있습니다.iOS6에서의 CFAutoRelease()와 같은 동작

iOS를 지원해야하기 때문에 CFAutoRelease를 사용할 때 충돌이 발생합니다. < 7. 제대로 출시 할 수있는 방법은 무엇입니까?

-(ABRecordRef) myRecord{ 
ABRecordRef newRecord = ABPersonCreate(); 
//some setting here 
return CFAutoRelease(newRecord); //how to release here? 
} 
+1

'CFAutoRelease'가 없습니다. –

+3

분명히 10.9와 iOS 7이 있습니다. (나도 몰랐습니다.) – Wevah

+0

TIL. 아직 문서화되어 있지는 않지만 iOS 7 API 차이점에 언급되어 있습니다. https://developer.apple.com/library/ios/releasenotes/General/iOS70APIDiffs/ –

답변

4

CoreFoundation 참조 정보는 myRecord 메서드에서 실제로 참조하지 않습니다. 대신 나는 myRecord의 호출자가 참조를 소유하고 그것을 공개 할 책임이있는 인터페이스를 정의 할 것입니다.

+3

메소드 이름을 올바르게 지정하십시오. 이 경우'newRecord'와 같아야합니다. 'new'로 시작하면 오브젝트가 균형을 유지해야한다는 것을 분명하게 알 수 있습니다. –

+2

사실, CoreFoundation을 사용할 때 '규칙 만들기'를 따라야합니다. 나는 실제로 메소드 이름을'CreateRecord '또는'myRecordCreate '라고 명명 할 것입니다. 다음은 'Create Rule'과 같은 더 많은 정보가있는 CoreFoundation 소유 정책에 대한 링크입니다. https://developer.apple.com/library/mac/documentation/corefoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html –

+0

'id'로 형 변환하고'-autorelease'를 호출 할 수도 있습니다. (받아 들여진 대답으로 여기에 또 다른 질문이 있습니다.) – Wevah

2

이 같은 코어 기반 객체에 대한 자신의 오토 릴리즈 기능을 구축 할 수 있어야한다 :

inline CFTypeRef MyAutorelease(CFTypeRef obj) { 
    id __autoreleasing result = CFBridgingRelease(obj); 
    return (__bridge CFTypeRef)result; 
} 

__autoreleasing를 사용하면 오토 릴리즈 풀에 결국 개체를 강제로.

+0

마이크 애쉬는 항상 길을 보여 줬습니다. – uchuugaka

+0

사실, 마이크가 보여준 방식은'__autoreleasing'을 사용하지 않습니다. 위의 코드는 블로그 게시물에 대한 내 의견에서 비롯된 것입니다. –

+0

아. 나는 그 사람을 읽은 후에 쓴다고 생각합니다. 너와 그의 스타일이 다르다. 당신의 후속 질문은 좋은 것입니다 – uchuugaka