[英]Objective-C Custom Setter
注意:我沒有使用ARC
我有一個具有以下屬性的UILabel: @property (nonatomic, retain) UILabel *someLabel;
我正在嘗試設置自定義設置器。 將下面的代碼會導致泄漏,因為@property
實際上是調用retain
呢?
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != self.someLabel) {
[self.someLabel release];
self.someLabel = [someLabel retain];
}
// some custom code here
}
注意:我沒有使用ARC
你真的,真的應該。
您的二傳手是一個無限循環。 對self.someLabel = ...
的調用與[self setSomeLabel:...]
的完全等效,導致循環。
正確的手動設置器如下所示:
- (void)setSomeLabel:(UILabel *)someLabel
{
[someLabel retain];
[_someLabel release];
_someLabel = someLabel;
// some custom code here
}
還有其他常見的模式。 一個主要的問題是,如果將對象重置為相同的值,是否應該運行“某些自定義代碼”。 如果不是,則此模式更有意義:
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel) {
[_someLabel release];
_someLabel = [someLabel retain];
// some custom code here
}
}
該代碼將導致您的應用進入無限循環,就像使用self.someLabel
導致調用方法setSomeLabel:
。
您可以嘗試使用以下代碼創建自定義設置器:
@synthesize someLabel = _someLabel;
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel)
{
[_someLabel release];
_someLabel = [someLabel retain];
}
// custom code
}
- (void)dealloc
{
[_someLabel release];
// ... other releases
[super dealloc];
}
不,這很好,因為您在此處使用自定義設置器。
@Property等同於聲明訪問器方法。
僅當未實現setter和/或getter時,@ Synthesize才會基於屬性聲明屬性生成訪問器方法。
我假設您沒有使用ARC ...
您正確地保留了傳入的someLabel,而且在屬性上調用release也不是一件好事!
我將使用實例變量而不是屬性:
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel) {
[_someLabel release];
_someLabel = [someLabel retain];
}
// some custom code here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.