2012-03-05 27 views
11

Tôi nhận được cảnh báo nàyVấn đề đếm tham chiếu tự động: Chỉ định đối tượng được giữ lại cho biến không an toàn_unretained; đối tượng sẽ được phát hành sau khi phân

"Automatic Reference Issue Đếm: Gán đối tượng giữ lại để biến unsafe_unretained; đối tượng sẽ được phát hành sau khi chuyển nhượng"

Đây là mã

.h

@interface myObject : NSObject 
{ 
} 

@property (assign) id progressEnergy; 

@end 

.m

@implementation myObject 

@synthesize progressEnergy; 

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; //warning appear on this line 
    } 

    return self; 
} 

@end 

Tôi đã cố gắng

@property (assign) progress* progressEnergy; 

nhưng may mắn không

bạn có thể vui lòng giúp tôi tìm ra những gì là sai?

Trả lời

27

Thay đổi

@property (assign) progress* progressEnergy; 

để

@property (strong) progress* progressEnergy; 

nên bạn myObject giữ đối tượng progress.

+0

cảm ơn bạn. Đó là vấn đề :) – zeroonnet

9

Cũng cảnh báo bạn rằng bạn đang chỉ định giá trị sắp được phát hành ở cuối phạm vi bao quanh, điều này sẽ xảy ra ở dòng tiếp theo. Vì vậy, đây là những gì init của bạn sẽ trông giống như sau ARC cho biết thêm trong kỳ diệu của nó:

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; 
     [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in 
    } 

    return self; 
} 

Vì vậy progressEnergy của bạn bây giờ là rất có khả năng (mặc dù không nhất thiết) để trở thành một con trỏ tòn ten.

Thay đổi định nghĩa về tài sản assign-strong:

@property (strong) progress* progressEnergy; 

Trong trường hợp đó, phương pháp init của bạn sẽ trông giống như:

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; 
     [progressEnergy retain]; ///< Since it's a strong property 
     [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in 
    } 

    return self; 
} 

Trong thực tế, nó gọi objc_storeStrong thay vì gọi retain như tôi đã hiển thị, nhưng về cơ bản nó tóm gọn xuống một số retain trong trường hợp này.

+0

cảm ơn bạn. Đó là vấn đề :) – zeroonnet

Các vấn đề liên quan