[英]Retain count and factory methods in Objective-C
我之前曾在這個論壇上找到過創建工廠函數以從筆尖構造自定義視圖的最佳方法( 這是我以前的文章)
我現在正在使用以下代碼:
+ (LoadingV *)loadingViewCopyFromNib
{
LoadingV *view = nil;
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"LoadingV" owner:self options:nil];
view = (LoadingV*)[nibViews objectAtIndex: 0];
// Setting up properties
CGRect frm = view.progress.frame;
frm.size.width *=1.5;
frm.size.height *=1.5;
view.progress.frame = frm;
view.waitLbl.text = NSLocalizedString(@"Please wait", @"");
return view; <------- warning is here
}
// In .h file
...
LoadingView* loadV;
@property (nonatomic, retain) LoadingView* loadV;
// in .m file
@synthesize loadV;
...
self.loadV = [LoadingV loadingViewCopyFromNib];
當我進行構建和分析時,我收到有關工廠功能的以下警告:
/LPAPP/Classes/LoadingV.m:34:5具有+0保留計數的對象返回給調用方,其中預期+1(擁有)保留計數
為什么會這樣呢? 我知道,在函數內分配的局部變量除非保留並自動釋放,否則不會超出其范圍。 但就我而言,我不是在創建新對象,而只是返回對現有對象的引用。 那么,為什么我會收到警告? 這樣安全嗎:)
干杯AF
盡管邁克是正確的,但警告的原因卻完全不同。 您的方法名稱包括“ copy”,它被解釋為返回+1保留計數(類似於alloc,init)。 請記住,一旦過渡到ARC,這可能會引起問題!
當涉及到諸如NSArray
類的集合類時,由objectAtIndex:
和其他類似訪問器返回的引用不能保證在釋放父容器時保持有效。 換句話說, objectAtIndex:
不返回自動發布的對象。
這意味着一旦釋放了來自其的數組,返回的指針可能最終將變得無效。
要解決此問題,請在return語句中使用retain
+ autorelease
:
return [[view retain] autorelease];
更新:
我無法在我的Xcode版本中重現此警告。 但是Martin可能是正確的,因為您使用的GCC / clang版本對“副本”的解釋不正確。 最新的Xcode和gcc / clang編譯器不會出現此警告,並且規則是僅將“ copy”或“ mutableCopy”的前綴解釋為返回+1保留的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.