簡體   English   中英

有條件地使@property強弱

[英]Conditionally make a @property strong or weak

我正在從API下載對象列表以顯示給用戶。 該列表包含兩種類型的對象。 想象一下,它們是書籍和作者的結合體,並且類定義如下所示:

@interface Book : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) Author *author;

@end

@interface Author : NSObject

@property (nonatomic, strong) NSString *fullName;
@property (nonatomic, weak) Book *book;

@end

Book都可以從API下載其Author信息,反之亦然。

如果API為我提供了一Book ,則可以在下載后設置其author屬性。 Author對象通過book屬性指向Book ,但是由於book屬性為weak ,因此不會創建ARC保留周期

但是,如果API首先給我一個Author ,然后下載它的Book ,則一旦設置了該對象的方法返回,該對象將被釋放,因為相同的屬性是weak

我想到了一些解決方法:

  • 創建一個存儲兩個對象的Content對象(不適用於多對多關系)
  • 創建單獨的strongBookweakBook屬性,然后創建一個名為bookreadonly屬性,該屬性檢查設置的內容並返回該屬性

盡管第二種選擇更可取,但兩者對我來說似乎都是混亂的。

有沒有一種方法可以使用Objective-C運行時將屬性從weak更改為strong (反之亦然)?

更新:我收到一些有關如何解決此問題的建議,我自己也沒有遇到任何麻煩。 這個問題專門針對是否有一種方法(a)為類的特定實例動態重新定義@properties,或(b)在特定情況下覆蓋AR​​C的retain / release行為(因為該問題在MRC中不存在) )。

只是黑暗中的一槍,但您可以創建屬性而不指定,然后將其與運行時API一起使用。 我沒有測試它,但是我認為它應該起作用:

//.h file
#import <Foundation/Foundation.h>

@interface SomeObject : NSObject
@property(nonatomic) NSObject *object;
@end


//.m file
#import "SomeObject.h"
#import <objc/runtime.h>
@implementation SomeObject
@dynamic object;

-(void)setObject:(NSObject *)object
{
    BOOL isWeak = NO;
    if(isWeak)
    {
        objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
    }
    else
    {
        objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_RETAIN);
    }
}

-(NSObject *)object
{
    return objc_getAssociatedObject(self, "object");
}

@end

在下載期間,創建一個可變字典以臨時存儲在本書之前到達的作者對象。 收到書后,查看該數組,查看是否有作者信息(如果有的話)附上。 完成后,清除可變數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM