Skip to content

Commit

Permalink
Merge pull request ReactiveCocoa#29 from Lightricks/feature/racsubjec…
Browse files Browse the repository at this point in the history
…t-leak

RACSubject: avoid retaining the subscribers strongly in the disposable.
  • Loading branch information
barakwei authored Nov 6, 2018
2 parents 372c9d0 + f91f435 commit a1e9510
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
8 changes: 7 additions & 1 deletion ReactiveObjC/RACSubject.m
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,14 @@ - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
@synchronized (subscribers) {
[subscribers addObject:subscriber];
}


@rac_weakify(subscribers, subscriber);
[disposable addDisposable:[RACDisposable disposableWithBlock:^{
@rac_strongify(subscribers, subscriber);
if (!subscribers || !subscriber) {
return;
}

@synchronized (subscribers) {
// Since newer subscribers are generally shorter-lived, search
// starting from the end of the list.
Expand Down
18 changes: 16 additions & 2 deletions ReactiveObjCTests/RACSubjectSpec.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,28 @@ - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable {
});

qck_it(@"should dispose the paired disposable when a subscription terminates", ^{
RACSubject* subject = [RACSubject new];
RACTestSubscriber* subscriber = [RACTestSubscriber new];
RACSubject *subject = [RACSubject new];
RACTestSubscriber *subscriber = [RACTestSubscriber new];

[[subject subscribe:subscriber] dispose];

expect(@(subscriber.disposable.disposed)).to(beTruthy());
});

qck_it(@"should release the subscriber after subject deallocation", ^{
__weak RACTestSubscriber *weakSubscriber;

@autoreleasepool {
RACTestSubscriber *subscriber = [RACTestSubscriber new];
weakSubscriber = subscriber;
RACSubject *subject = [RACSubject subject];

[subject subscribe:subscriber];
}

expect(weakSubscriber).to(beNil());
});

qck_itBehavesLike(RACSubscriberExamples, ^{
return @{
RACSubscriberExampleSubscriber: subject,
Expand Down

0 comments on commit a1e9510

Please sign in to comment.