찾다

 >  Q&A  >  본문

ios - 왜 일부 책에서는 초기화 방법과 dealloc 방법이 항상 인스턴스 변수를 통해 데이터를 읽고 써야 한다고 말하는 이유가 무엇입니까?

Effective Objective -c2.0 이 책에서는 초기화 방식과 Dealloc 방식에서는 항상 인스턴스 변수를 통해 데이터를 읽고 써야 한다고 나와 있는데, 한참을 읽어도 그 이유를 모르겠습니다. 이 책을 읽어본 사람이 있나요?

我想大声告诉你我想大声告诉你2851일 전1080

모든 응답(1)나는 대답할 것이다

  • 黄舟

    黄舟2017-05-17 10:07:31

    책에 아주 명확하지 않나요:

    • _name = @"Jack" setter를 통해 메시지를 보내지 않고 변수에 직접 값을 할당하는 것이 빠릅니다. _name = @"Jack" 不经过setter的消息发送,直接为变量赋值,速度快。

    • 对于以下的 name 属性:

    @property (nonatomic, copy) NSString *name;

    直接赋值是: _name = @"Jack"; ,通过 self.name = @"Jack" 其实等同于 _name = @"Jack".copy;

    • self.name = @"Jack" 会触发KVO,_name = @"Jack" 不会

    • self.name = @"Jack" 可以在 setter 方法中进行断点调试,每次赋值你都知道。

    所以有一种合理折中方案就是,读取数据的时候用 NSString *str = _name,赋值用 self.name = @"Jack"

    另外需要注意的是子类可能复写setter方法,用 self.name = @"Jack"可能不等同于 _name = @"Jack".copy

  • 다음 name 속성의 경우:

    으아악 #🎜🎜#직접 할당은 _name = @"Jack";이며, self.name = @"Jack"을 전달하는 것은 실제로 _name = @"와 동일합니다. 잭 ".copy;#🎜🎜# #🎜🎜# #🎜🎜##🎜🎜#self.name = @"Jack"은 KVO를 트리거하지만 _name = @"Jack"은 KVO를 트리거하지 않습니다#🎜🎜# #🎜🎜##🎜🎜#self.name = @"Jack" setter 메서드에서 중단점 디버깅을 수행할 수 있으며 값이 할당될 때마다 알 수 있습니다. #🎜🎜# #🎜🎜#따라서 합리적인 절충안은 데이터를 읽을 때 NSString *str = _name을 사용하고 값을 할당할 때 self.name = @"Jack"을 사용하는 것입니다. #🎜🎜# #🎜🎜# 또한 하위 클래스가 setter 메서드를 재정의할 수 있다는 점에 유의하세요. self.name = @"Jack"를 사용하는 것은 _name = @"Jack".copy와 동일하지 않을 수 있습니다. . #🎜🎜# #🎜🎜# 무엇에 대해 불분명한지 이해가 되지 않아 제 생각을 토대로 간략하게 설명하겠습니다. #🎜🎜#

    회신하다
    0
  • 취소회신하다