13
A
回答
22
@property (getter=yourGetter,setter=yourSetter:) UIButton *but;
0
實施
- (void)setBut:(UIButton *)aButton;
它也許應該看起來像
- (void)setBut:(UIButton *)aButton {
[but release];
but = [aButton retain];
// whatever
}
23
@Sascha幾乎是正確的,但他的代碼中有一個微小的錯誤;)
它看起來像是:
A)
-(void)setBut:(UIButton *)value {
if (but != value) {
[but release];
but = [value retain];
}
}
或B)
-(void)setBut:(UIButton *)value {
[but autorelease];
but = [value retain];
}
(A)是(非常)稍微更有效,(B)是更具有可讀性。
爲什麼我們需要在選項(A)的if語句,而不是僅僅釋放&保留@薩沙的回答?
如果您傳入同一對象兩次會發生什麼?
即
// We set our button for the first time
UIButton *test = [UIButton alloc] init];
[self setBut:test];
[test release];
// Much later in the code, we set the button again
[self setBut:test];
如果我們沒有檢查but
不是一個不同的對象,我們將在我們的二傳手做的第一件事就是release
它。然後我們會嘗試retain
一個不存在的對象,導致崩潰。
注意我們並不需要選項(B)中的if語句,因爲autorelease不會立即釋放按鈕,所以我們有時間在不釋放按鈕的情況下再次保留它。
1
A B +)替代deanWombourne的解決方案:
-(void)setBut:(UIButton *)value {
[value retain]
[but release];
but = value;
}
該解決方案將防止出現問題,其中值是但一個子對象。
的A +)替代deanWombourne的解決方案:
-(void)setBut:(UIButton *)value {
if (but != value) {
[value retain]
//insert here but's cancel, invalidate, delegate = nil, ...
[but release];
but = value;
}
}
該解決方案將防止出現問題,其中值是但一個子對象。 它可以讓你添加一個NSURLConnection的cancel
,一個NSTimer或NSPort的invalidate
,一個委託爲零,...
0
我相信這是@synthesised制定者如何做到這一點,它適用於所有情況,無論您分配相同的對象與否:
- (void)setBut: (UIButton*)aButton
{
id oldObject = but;
but = [aButton retain];
[oldObject release];
}
不能出錯,只要我能看到。
相關問題
- 1. Property Observer vs自制setter
- 2. javax.persistence PROPERTY訪問自定義getter/setter名稱
- 3. spring @Autowire property vs setter
- 4. @property setter中的泄漏
- 5. python @property setter代表團
- 6. @property,setter和getter問題?
- 7. Objective-C的自定義的getter/setter
- 8. 可可綁定:自定義setter方法?
- 9. swift @property指令:自定義訪問器
- 10. 自定義帖子類型「property」(wp-property plugin)查詢問題
- 11. 生成自定義的Java Getters和Setter
- 12. 類別中的自定義NSManagedObject setter
- 13. Laravel中的自定義setter和getters
- 14. Realm對象的自定義setter/willSet
- 15. assign @ property的setter是如何實現的?
- 16. 續集,自定義setter,沒有設置
- 17. DataBinding Android,自定義setter,不工作?
- 18. scala Ide自定義setter錯誤
- 19. 使用自定義setter或KVO
- 20. 定義與自定義名稱有關的多個setter方法
- 21. 如何爲自定義小部件定義自定義getter和setter? - Dojo
- 22. 定製的setter/getter方法@property Objective-C的
- 23. 如果沒有定義setter或deleter,爲什麼有人會使用@property?
- 24. 在協議中定義@property
- 25. 覆蓋@property setter和無限循環
- 26. 在定製getter和setter方法時使用@property
- 27. 自定義類和@property的奇怪東西int的
- 28. 推進自定義Setter與SQL特定的東西
- 29. 獲取表達式的自定義對象<model,property>
- 30. 獲取自定義類調解器中Property的值
另請注意,正如Sascha指出的那樣,如果您提供自定義setter,則需要您自行釋放/保留參考。 – devios1
請注意,自定義getter和setter與普通SELECTOR類似,因此yourSetter:必須有尾部冒號 – onmyway133