2011-07-04 1 views
1

를 시스템에 반환 :객체 내가 코드를 질문

@interface PhotoListViewController : UIViewController 
{ 
    IBOutlet UIImageView* firstPicContainer; 
    IBOutlet UIImageView* secondPicContainer; 
    UIImage* pic_one; 
    UIImage* pic_two; 
    IBOutlet UILabel* firstPicLabel; 
    IBOutlet UILabel* secondPicLabel; 
    NSString* firstPicName; 
    NSString* secondPicName; 
    IBOutlet UILabel* authorLabelA; 
    IBOutlet UILabel* authorLabelB; 
    NSString* authorName; 

} 
@property (retain) UIImage* pic_one; 
@property (retain) UIImage* pic_two; 
@property (copy) NSString* firstPicName; 
@property (copy) NSString* secondPicName; 
@property (copy) NSString* authorName; 


@end 

질문은 : 나는 누구의 특성 I 선언 한 단지 사람들을, 객체의 전체 팩을 해제하거나해야합니까? 예 는 : -viewDidLoad에

firstPicLabel.text = firstPicName; 

: firstPicName가있는 NSString되어 설정되었을 때, 보존되어, 그 용기는 다음과 같이 할당된다 UILabel의 * firstPicLabel이다. 따라서 객체로서의 레이블은 그 자체로 보유되지 않으며, 그 속성은 그대로 유지됩니다. 같은 것은 다른 객체와 함께 있고, 속성은 유지되며, 다른 것들은 단지 컨테이너입니다. 이 컨테이너의 소유자는 자신의보기이며 이는 릴리스에 대한 책임이 있어야하지만 여기서 약간 혼란 스럽습니다. 그래서 그 점을 분명히하고 싶습니다. 감사합니다. .

+0

ivar 이름이나 메소드 이름에 밑줄을 넣지 마십시오. 그것은 표준과 비교하여 제자리를 찾지 못합니다. – bbum

답변

1

짧은 대답 : retain (또는 copy)으로 선언하는 속성의 경우 dealloc 메서드에서 해당 값을 nil으로 설정해야합니다. 다른 개체 및 필드에서 선언 된 속성은 사용자가 자신을 유지하지 않아도 걱정할 필요가 없습니다.

+0

글쎄, 그게 정확히, 내가 무엇을 요구하고 있었는지 :) – Matubo

+0

그래서, 그 레이블과 UIImageViews에 대해 걱정할 필요가 없습니까? 해당 속성은 이러한 선언 된 속성의 값으로 할당되며 할당되었으므로 명시 적으로 해제하면 안됩니다. – Matubo

+0

@Matubo - 그럼 네가 무엇을 요구하는지 모르겠다. 어느 물체를 놓아야하는지 알고 싶다고 생각했는데? 그렇다면 대답은 "보유/복사로 선언 한 속성과 코드에서 수동으로 보유한 다른 모든 객체"입니다. – aroth

1

귀하의 인터페이스는 출시해야 할 정보와 제공해서는 안되는 정보를 제공하지 않습니다. 단서를 제공 할 것입니다.

위와 같이 선언 한 모든 ivars 및 속성을 가질 수 있지만 초기화하지 않았거나 속성에 액세스하지 않은 경우 처음에는 해제 할 개체가 없습니다. 엄지 손가락의

규칙은 다음과 같습니다

1) 당신이 작성하는 경우, 복사 또는 개체를 유지, 당신은 그것을 해제 할 책임이 있습니다.

2) 위의 규칙 1을 참조하십시오.

@implementation... ... pic_one = [UIImage imageNamed:@"test.png"]; ... @end 

pic_one

이 바르로 선언하지만, 오토 릴리즈 객체에 할당됩니다

은 실제로, 여기에 몇 가지 예입니다. 당신은 그것을 풀어 줄 필요가 없습니다.

또 다른 예 : 당신은 유지로 당신이 그것을 해제 할 책임이 있습니다, 그래서 선언의 평가자/속성을 통해이있는 UIImage 객체를 할당

@implementation.... 
... 
self.pic_one = [UIImage imageNamed:@"test.png"]; 
... 
@end 

. "장면 뒤에서", 속성을 통해 객체를 할당 할 때 일어나는 일이 있습니다 (예 : retain으로 선언 된 속성의 경우 사본은 약간 다르지만 같은 원리입니다).

- (void)setPic_One:(UIImage*)newImage 
{ 
    if (pic_One != newImage) 
    { 
     [newImage retain]; 
     [pic_One release]; 
     pic_One = newImage; 
    } 
} 

그리고 마지막 하나 : 당신이 alloc'ing하는이 경우

UIImage *testImage = [[UIImage alloc] initWithImage:@"test.png"]; 
self.pic_one = testImage; 
[testImage release]; 

/init'ing있는 UIImage 객체를 (생성), 당신이 그것을 해제 할 책임이 있습니다 그래서. 동시에 retain으로 선언 된 속성에이 속성을 지정하기 때문에 작업을 완료 할 때도 해제해야 할 책임이 있습니다 (일반적으로 dealloc 메서드에서).

+0

예, 이것은 모든 스타터에게 ABC 인 메모리 관리의 기본 사항입니다. 그러나 내가 분명히하고 싶은 순간은 다음과 같습니다 : firstPicContainer.image = self.pic_one; UIImageView는 iVar에서 선언되며 해당 속성은 유지 된 값에 할당됩니다. 그런 다음 -dealloc에서 해제해야합니까? – Matubo

+0

문제는 상황의 이원성에 있습니다. 한편으로는 속성 값이 저에게 유지됩니다. UIImageView의 속성 'image'는 iself : '@property (nonatomic, retain) UIImage * image'에 의해 유지됩니다. 내가 그것을 공개해야한다는 모든 것을 보여줍니다. 그러나 다른 한편으로는 : 나는 기억 규칙을 어 기지 않았다. 인스턴스를 생성하기 위해 'alloc''copy''new'functions를 사용하지 않았다. 그리고 UIImageView는 하위 뷰로 뷰에 의해 소유되므로 뷰가 뷰를 릴리즈해야합니다. 나는 정말로 필사적이다. – Matubo

+0

첫 번째 댓글에 답하려면 : 'firstPicContainer.image = self.pic_one', firstPicContainer는 속성을 통해 액세스하지 않기 때문에 ivar를 통해 직접 액세스해야하기 때문에 공개해서는 안됩니다. 그러나 firstPicContainer도 IBOutlet으로 선언되었으므로 펜촉이로드 될 때보기에 유지됩니다 (Interface Builder에서 UIImageView 객체에 연결 한 경우). 이 경우 인터페이스 빌더가 속성을 통해 액세스하기 때문에'firstPicContainer'를 릴리스해야합니다 (또한 viewDidUnload'에서 nil로 설정하는 것이 좋습니다). – Rog