[英]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
對象(不適用於多對多關系) strongBook
和weakBook
屬性,然后創建一個名為book
的readonly
屬性,該屬性檢查設置的內容並返回該屬性 盡管第二種選擇更可取,但兩者對我來說似乎都是混亂的。
有沒有一種方法可以使用Objective-C運行時將屬性從weak
更改為strong
(反之亦然)?
更新:我收到一些有關如何解決此問題的建議,我自己也沒有遇到任何麻煩。 這個問題專門針對是否有一種方法(a)為類的特定實例動態重新定義@properties,或(b)在特定情況下覆蓋ARC的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.