2015-01-12 3 views
0

Я новичок в Objective-C от iOS 8, поэтому немного знаю о ARC, а мой код находится под ARC.Безопасно ли установить свойство внутри блока

Скажем, у меня есть класс. UserModel обладает такими свойствами, как NSArray и NSString. У меня есть initWithDataSource: данные для выделения init UserModel.

Безопасно ли установить свойство внутри блока, из памяти perspetive? Я чувствую, что мой код вызовет какой-либо цикл сохранения. хотите знать, должен ли я использовать что-то вроде слабого себя или других вещей, чтобы установить свойство?

// в 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]; 
} 
+0

Я чувствую, что есть сохранить цикл, потому что я доступ к себя внутри блока, так что я должен использовать слабый сам. Есть ли какая-либо передовая практика для установки блока insisde свойства? – Wingzero

ответ

0

Ваших опасений справедливы, но не сохраняет цикл:

анонимный блок не будет ссылаться сам self - таким образом, нет никакой циклической ссылки.

Смотрите также: Using weak self in dispatch_async function

+0

Как узнать, анонимный блок? – Wingzero

+1

@Wingzero Когда вы определяете блок _inline_ так же, как вы определили обработчик завершения в своем примере, у вас нет переменной в коде, ссылающемся на этот блок.Однако вы можете иметь свойство класса, которое ссылается на блок. Тогда экземпляры этого класса могут быть назначены блоком некоторым клиентом, а 'self' может вызвать этот блок. В этом случае self ссылается на блок. Затем, когда этот блок ссылается на 'self', тогда да, вы получите цикл сохранения. – CouchDeveloper

2

это должно быть только вопрос, если self сохраняет ссылку на блок его доступ в., Но если вы хотите быть в безопасности, только за пределами этого блока вы можете назначить слабую переменную типа SELF к себе, так что вы обращаетесь к слабой версии себя, смягчая любые сомнения, например:

__weak TypeOfSelf weakSelf = self; 

//use weakSelf in block 

также, возможно, добавить некоторые нулевые проверки, чтобы убедиться, его все еще жив, прежде чем делать что-нибудь это

+0

Как мне определить, поддерживает ли self ссылку на блок? – Wingzero

+1

, но в этом случае вы arent, но если вы внедрили свойство в HomeViewController, которое содержало ссылку на блок, тогда у self была бы ссылка на блок, и блок имел бы ссылку на self. но, возможно, singleton 'MySharedInstance' не отпускает блок из-за этого, и это также вызовет проблему – Fonix

+0

', но, возможно, singleton MySharedInstance никогда не отпускает блок, и это также вызовет проблему' именно то, что я думаю происходит здесь. – HAS

Смежные вопросы