iOS Objective C 覆盖属性设置器

Posted

技术标签:

【中文标题】iOS Objective C 覆盖属性设置器【英文标题】:iOS Objective C Override Property Setter 【发布时间】:2017-08-29 20:08:15 【问题描述】:

在我的课堂上@property BOOL clearCookies;

我想设置它,以便在设置项目时我可以做一些额外的事情。

在我的代码中,我可以做类似classInstance.clearCookies = YES;

然后在 setter 方法中类似这个来自 android 的 java 示例:

public void setClearCookies(boolean clearCookies) 
        _instance.clearCookies = clearCookies;
        _instance.doOtherThings();
    

在 Objective C 中实现这一目标的最佳方法是什么?基本上我想设置布尔属性,然后还做一些其他的事情(实际上是从我的UIWebView 清除 cookie)

【问题讨论】:

【参考方案1】:
-(void)setClearCookies:(BOOL)clearCookies

    @synchronized(self)
    
       _clearCookies = clearCookies;
       [self doOtherThings];
    


- (BOOL)clearCookies

   @synchronized (self)
   
       return _clearCookies;
   

【讨论】:

看起来很完美!感谢您的快速响应! 看起来它不喜欢合成吸气剂:writable atomic property cannot pair a synthesized getter with a user defined setter。你介意提供一个如何为此编写吸气剂的例子吗? :) 最好将属性设为非原子而不是将其保留为原子但以非原子方式实现 getter/setter。 @TomHammond 我更新了我的答案。此代码将保持 setter 和 getter 原子【参考方案2】:

你可以这样做:

-(void)setClearCookies:(BOOL)clearCookies 
        _clearCookies = clearCookies;
       [self doOtherThings];
    

【讨论】:

那不是java吗? :) @TomHammond haha​​ 更新了语法 - java/swift 混淆 - 终于更正了:D【参考方案3】:

另一种避免线程冲突的方法(替代@synchronized())是使用Grand Central Dispatch(在大多数情况下是faster而不是前者):

@property (assign, nonatomic) BOOL clearCookies;

// Later in code
static dispatch_queue_t clearCookiesQueue;

- (void)setClearCookies:(BOOL)clearCookies 
    [self initializeClearCookiesQueue];

    dispatch_async(clearCookiesQueue, ^ // Note, this is "async"
        _clearCookies = clearCookies;
    );



- (BOOL)clearCookies 
    [self initializeClearCookiesQueue];

    __block BOOL clearCookies;
    dispatch_sync(clearCookiesQueue, ^ // Note, this is "sync"
        clearCookies = _clearCookies;
    );

    // As "sync" waits until the operation is finished, you can define
    // your other operations here safely.
    [self doOtherStuff];

    return clearCookies;



/**
    Checks if the queue for the clearCookies property is initialized and,
    if it's not, initializes it.
*/
- (void)initializeClearCookiesQueue 
    if ( ! clearCookiesQueue ) 
        // We'll use a serial queue to avoid conflicts reading/writing the ivar
        clearCookiesQueue = dispatch_queue_create("com.yourapp.yourviewcontroller.someUniqueIdentifier", DISPATCH_QUEUE_SERIAL); // Note, this is a C string, not NSString
    

如果你不关心线程,或者你不需要它,只需覆盖你的 setter 就足够了:

- (void)setClearCookies:(BOOL)clearCookies 
    _clearCookies = clearCookies;
    [self doOtherStuff];

【讨论】:

以上是关于iOS Objective C 覆盖属性设置器的主要内容,如果未能解决你的问题,请参考以下文章

创建跨平台c ++触摸管理器。在c ++中传递Objective-c对象涉及代码

Objective-C 中的弱属性和强属性设置器属性

ios学习路线—Objective-C(属性修饰符)

Objective C - 使用属性获取访问器与直接使用 iVar

如何干净地覆盖属性设置器?

覆盖继承的属性设置器