2014-10-28 68 views
0

如果我有:访问导致保留周期的实例变量?

@interface SomeClass() { 
    NSObject *_someObject; 
} 

... 

- (void)someMethod { 
    [self doSomething:^(NSObject *someOtherObject) { 
      _someObject = someOtherObject; 
    }]; 
} 
... 
会不会有

被保留与自我循环,因为我们在该块内访问_someObject?

在这种情况下
+1

只要块没有被“自我”保持,则没有。 – rmaddy 2014-10-28 21:40:37

+1

我们真的需要看看doSomething:正在做什么。 – 2014-10-28 21:41:01

+0

使用属性。简单。 – Fogmeister 2014-10-28 23:28:12

回答

3

,自会被保留,如果你访问类变量喜欢这里,它同样喜欢:

- (void)someMethod { 
    [self doSomething:^(NSObject *someOtherObject) { 
      self->_someObject = someOtherObject; 
    }]; 
} 

如果创建的块将自前被破坏,一切都会好的,但如果阻滞活得更长,然后所有其他对自我的引用,自我会留在记忆中,而阻止不会释放它。

我建议使用这一个代码:

@interface SomeClass()  

@property (nonatomic, strong)NSObject *someObject; 

... 

- (void)someMethod { 
    __weak SomeClass *weak_self = self; 
    [self doSomething:^(NSObject *someOtherObject) { 
      weak_self.someObject = someOtherObject; 
    }]; 
} 
... 

@interface SomeClass() { 
    NSObject *_someObject; 
} 

... 

- (void)someMethod { 
    __weak SomeClass *weak_self = self; 
    [self doSomething:^(NSObject *someOtherObject) { 
      __strong SomeClass *strong_self = weak_self; 
      strong_self->_someObject = someOtherObject; 
    }]; 
} 
... 
+1

你的弱点甚至会提升吗?兄弟? – egarlock 2014-10-28 21:58:26