在块中设置属性是否安全

时间:2015-01-12 06:19:21

标签: ios objective-c

我是iOS 8中Objective-C的新手,所以对ARC有一点了解,我的代码在ARC下。

假设我有一个类UserModel具有NSArray和NSString等属性。我有initWithDataSource:data来为init分配一个UserModel。

在内存块中设置属性是否安全?我觉得我的代码会导致任何保留周期。我想知道我应该使用弱自我或其他东西来设置属性吗?

//在HomeViewController.m中

@interface HomeViewController() <UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UILabel *HomeLabel;
@property (strong, nonatomic) IBOutlet UICollectionView *ProjectCollectionView;
@property (strong, nonatomic) UserModel * HomeViewUserModel;
@end


/**
 *  fetch latest projects from remote side
 */
- (void) fetchUserModelFromRemote {
    [MySharedInstance getProjectDataOnSuccess:^(id result) {

        NSDictionary *data = result[@"data"];
        self.HomeViewUserModel = [[UserModel alloc] initWithDataSource:data];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"alertCountUpdate" object:self userInfo:@{@"count": (NSNumber *)data[@"unread"]}];

    }onFailure:^(id error) {}];

    [MyCache cacheProjectListWithData:self.HomeViewUserModel];
}

2 个答案:

答案 0 :(得分:2)

如果self保留对其所访问的块的引用,那么它应该只是一个问题。但是如果您想要安全,那么只需在块之外,您就可以分配一个弱变量的self&#39; s键入自我,以便您访问自我的弱版本,减轻任何疑虑,例如:

__weak TypeOfSelf weakSelf = self;

//use weakSelf in block

也许可以添加一些零检查以确保它在执行任何操作之前仍然存在

答案 1 :(得分:1)

您的疑虑是有效的,但没有保留周期:

self本身不会引用匿名块 - 因此,没有循环引用。

另请参阅:Using weak self in dispatch_async function