2011-09-24 4 views
1
@interface DataMode : NSObject { 

    NSString * name; 
} 

@property (retain) NSString * name; 

- initWithName:(NSString *)name_; 
@end 


@implementation DataMode 

@synthesize name; 

- initWithName:(NSString *)name_ 
{ 
    if ([super init] != nil) 
    { 
     name = name_; 
     return self; 
    } 
    return nil; 
} 

@end 


- (void) pressed:(id)sender 
{ 

     NSString * str = [NSString stringWithFormat:@"zhang"]; 
     DataMode * a = [[DataMode alloc] initWithName:str]; 

     a.name; 
     a.name; 
     a.name; 
     a.name; 
     a.name; 

     NSLog(@"name count:%d",[a.name retainCount]); 

     [ a release]; 

     NSLog(@"str count:%d",[str retainCount]); 

} 
@end 

the output is 
name count:7 
str count:7 

그러나 코드는 메모리를 누설하지 않습니다. 나는 누수와 Active monitor tool의 결과를 얻는다. 새로운 보유 발견 또는 오해?

누군가가 말을 놀라운

때문에 내가 시작 "이름을 @property (유지);" eaual 아래의 동일한 방법. 그 .IT 출력의 상기 reslut를 설명 할 수없는 경우

- getname 
{ 
    return name; 
} 

난있어서 너무

- getname 
{ 
    [name retain]; 
    [name autorelease]; 
    return name; 
} 

그래서이 누출 높은 숫자 7을 설명 할 수없고한다고 생각 모든 메모리.

이것은 내 생각입니다. 너무 많은 시간을 필요로합니다. 나는 부끄러워.

내 이해가 맞습니까 ??? 귀하의 게시물과 의견을 환영합니다.

+2

실수로 'retainCount'를 사용하여 메모리 관리를 점검하고 있습니다. 코드가 멋지게 보인다. alloc과 릴리스의 균형을 잡았다. 인스 트루먼 트는 누수가 없다는 것을 알려줍니다. 그것이 당신이 걱정할 필요가있는 전부입니다. – Abizern

+0

사실 나는 그의 생성자에 문제가 있습니다. 그는 "self.name"대신 "name"을 사용합니다. 실제로이 변수를 내부 변수와 속성으로 할당한다고 생각합니다. 따라서 유지되지 않습니다. 누수가없는 유일한 이유는 stringWithFormat을 사용했기 때문입니다. –

+2

개인적으로 나는 이니셜 라이저에서'name = [name_ copy]'를 사용하고 dealloc에서'name'을 릴리즈해야한다고 생각합니다.'init' 함수에서'self '를 호출하는 것은 일반적으로 좋은 생각이 아닙니다. – Abizern

답변

-2

당신은

- initWithName:(NSString *)name_ 
{ 
    self = [super init]; 

    if (self != nil) 
    { 
     name = name_; 
    } 
    return self; 
} 
4

"누군가"를 입력 놈이야는 잘못된 것입니다. The Objective-C Programming Language에서 :

당신이 retain 또는 copy을 지정하고 nonatomic를 지정하지 않으면, 다음 참조 카운트 환경에서, 객체 속성에 대한 합성 get 접근 잠금을 사용하고 유지하고 반환 값을 autoreleases -THE 구현은 다음과 유사합니다

[_internal lock]; // lock using an object-level lock 
id result = [[value retain] autorelease]; 
[_internal unlock]; 
return result; 

당신이 nonatomic를 지정하는 경우, 객체 속성의 합성 접근은 단순히 직접 값을 반환합니다.

2

1) retainCount은 쓸모가 없습니다.

2) retainCount은 쓸모가 없습니다.

3) 네, 당신의 재산은이 규칙을 깰 수있는 몇 가지 경우가 있습니다 (+ 오토 릴리즈를 유지 사용해야합니다 - 내가하지 상세 여기가)

- (NSString *)name { return [[name retain] autorelease]; 

(이 또한주의거야 하지 retain

4)는 NSString 속성이 선언되어야 copy()

5) 당신의 initWithName:해야 사본)의 스레드가 없으며, 재산하지 인수 name_

name = [name_ copy]; 
1

는 환경에 새로운 점을 감안 (속성을 가정이 복사), 당신은 가장 가능성 ARC를 사용하여 전혀 이런 종류의 물건에 대해 걱정하지해야합니다.

retainCount는 쓸모가 없습니다. 전화하지 마세요.

반복하려면 :

retainCount는 쓸모가 없습니다. 전화하지 마세요.

훨씬 더 정확하고 정확하며 오도 된 도구가 적기 때문에 누출을 찾는 데 유용하지 않습니다.

여러 코드에 문제가 (그러나 누출 그들 중 하나되지 않음)이 있습니다

  • 있는 NSString * 속성 copy

  • 당신이를 설정하는 속성을 사용하지 않는해야 문자열 값이 init이므로 DataMode 인스턴스는 문자열을 유지하지 않습니다.

  • 당신이 stringWithFormat:을 사용하기 때문에 더 할당 해제의 방법

이없는 상수 문자열이 아닌 상수 문자열로 설정되어 있습니다. 상수 문자열 또는 stringWithString:을 사용했다면 abazillionsomething (부호없는 -1 ... UINT_MAX ...)이됩니다. 어떤 경우

, 당신이 가지고 : 인스트루먼트는 누출을 주장하는 경우

  • +1 stringWithString:
  • 일에 대한 a.name을 호출하기위한 모든 시간이

라고하는 게시 스크린 샷.