开发者

NSAutoreleaseNoPool while doing NSLog - Mac App development

I am trying out a program in Xcode, and I have created a new Mac Cocoa Application. I have a class called Photo with two instance variables Caption, Photographer. In the main function, I supply values to them as follows.

Photo *obj = [[Photo alloc]init];
obj.caption=@"Something";
obj.photographer=@"Hari";
NSLog(@"Name: '%@'",[obj caption]);
[obj release];

I 开发者_如何学JAVAget the output called Name: 'Something', but along with that I get this line

2011-02-22 11:56:03 test_1[1402:a0f] * __NSAutoreleaseNoPool(): Object 0x100002078 of class NSCFString autoreleased with no pool in place - just leaking

Can someone please explain why this line is appearing in the console?

Thanks,

Hariharan


Cocoa makes use of autorelease pools. An autorelease pool keeps references to objects that have been autoreleased and, when the pool is drained, it sends a -release message to those autoreleased objects.

In the vast majority of cases, Cocoa applications should have at least one autorelease pool in place because Cocoa makes heavy use of autoreleased objects. When a Cocoa application is run, Cocoa automatically creates autorelease pools for the application.

In your case, it seems that your application is a Foundation program instead of a full blown Cocoa application. As such, it is your responsibility to set up an autorelease pool for your program. For instance,

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Photo *obj = [[Photo alloc] init];
    // …

    [pool drain];
    return 0;
}

Note that the autorelease pool is not strictly necessary. If there’s no autorelease pool, your program will output that warning and, depending on the specifics of your program, you might leak objects. As leaking memory is a bad feature in a program, especially in long-lived programs or programs that allocate a lot of memory, it is advisable to always set up an autorelease pool.

That said, you haven’t sent -autorelease yourself in that piece of code, so why is there an autoreleased string? I’m assuming you’ve synthesised the caption property, and the compiler has created an accessor method that returns an autoreleased string containing the photo caption. When you send [obj caption], you get an autoreleased string, and consequently a warning since you haven’t set up an autorelease pool.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜