在arc環境中默認行爲,對對象進行retain。bash
舉例spa
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSObject *obj = [[NSObject alloc] init];
//默認指針被__strong修飾,等價於:__strong NSObject *p = obj;
NSObject *p = obj;
obj = nil;
NSLog(@"obj = %@", p);
}
複製代碼
打印結果指針
obj = <NSObject: 0x100706b90>
複製代碼
不會對對象進行retain,當對象銷燬時,會自動指向nilcode
舉例對象
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSObject *obj = [[NSObject alloc] init];
__weak NSObject *p = obj;
obj = nil;
NSLog(@"obj = %@", p);
}
複製代碼
打印結果內存
obj = (null)
複製代碼
不會對對象進行retain,當對象銷燬時,會依然指向以前的內存空間(野指針)string
舉例it
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
@implementation Person
- (void)dealloc {
NSLog(@"--dealloc--");
}
@end
int main(int argc, const char * argv[]) {
Person *obj = [[Person alloc] init];
__unsafe_unretained Person *p = obj;
obj = nil;
NSLog(@"obj = %@", p);
}
複製代碼
打印結果io
--dealloc--
obj = <Person: 0x101c5e9f0>
複製代碼
對象被釋放了,但若是內存沒有被從新利用,那麼仍是能打印出Person對象;此時訪問對即爲"殭屍"對象。class